/ Hex Artifact Content
Login

Artifact bb57b0b5ba1351335091ce4ec43b40968746f03afd65c9e2920d7cbe4dc98133:


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 70 4e 65  gg = -1;.    pNe
6690: 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20  w->pWin = 0;.   
66a0: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
66b0: 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d       if( nExtra=
66c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  =0 ){.        pN
66d0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
66e0: 49 6e 74 56 61 6c 75 65 7c 45 50 5f 4c 65 61 66  IntValue|EP_Leaf
66f0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
6700: 75 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c 75  u.iValue = iValu
6710: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
6720: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
6730: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
6740: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20  &pNew[1];.      
6750: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
6760: 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e  ->z!=0 || pToken
6770: 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->n==0 );.      
6780: 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20    if( pToken->n 
6790: 29 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75  ) memcpy(pNew->u
67a0: 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d  .zToken, pToken-
67b0: 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a  >z, pToken->n);.
67c0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
67d0: 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e  zToken[pToken->n
67e0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  ] = 0;.        i
67f0: 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 73 71  f( dequote && sq
6800: 6c 69 74 65 33 49 73 71 75 6f 74 65 28 70 4e 65  lite3Isquote(pNe
6810: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20  w->u.zToken[0]) 
6820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
6830: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
6840: 30 5d 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e  0]=='"' ) pNew->
6850: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51  flags |= EP_DblQ
6860: 75 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20  uoted;.         
6870: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
6880: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  pNew->u.zToken);
6890: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
68a0: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c   }.    }.#if SQL
68b0: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
68c0: 54 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  TH>0.    pNew->n
68d0: 48 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64  Height = 1;.#end
68e0: 69 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  if  .  }.  retur
68f0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
6900: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
6910: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
6920: 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d  from a zero-term
6930: 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61  inated token tha
6940: 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  t has.** already
6950: 20 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a   been dequoted..
6960: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6970: 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
6980: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
6990: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71  /* Handle for sq
69a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
69b0: 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c  o() (may be null
69c0: 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  ) */.  int op,  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
69e0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
69f0: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
6a00: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20  har *zToken     
6a10: 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65   /* Token argume
6a20: 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  nt.  Might be NU
6a30: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e  LL */.){.  Token
6a40: 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b   x;.  x.z = zTok
6a50: 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69  en;.  x.n = sqli
6a60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b  te3Strlen30(zTok
6a70: 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  en);.  return sq
6a80: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
6a90: 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d  b, op, &x, 0);.}
6aa0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73  ../*.** Attach s
6ab0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6ac0: 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20  d pRight to the 
6ad0: 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  Expr node pRoot.
6ae0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d  .**.** If pRoot=
6af0: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
6b00: 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61   that a memory a
6b10: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
6b20: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  has occurred..**
6b30: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
6b40: 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65  elete the subtre
6b50: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
6b60: 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ght..*/.void sql
6b70: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
6b80: 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65  btrees(.  sqlite
6b90: 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70  3 *db,.  Expr *p
6ba0: 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c  Root,.  Expr *pL
6bb0: 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69  eft,.  Expr *pRi
6bc0: 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f  ght.){.  if( pRo
6bd0: 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ot==0 ){.    ass
6be0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
6bf0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
6c00: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6c10: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
6c20: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6c30: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
6c40: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
6c50: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
6c60: 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  Root->pRight = p
6c70: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f  Right;.      pRo
6c80: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
6c90: 50 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67  Propagate & pRig
6ca0: 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ht->flags;.    }
6cb0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29  .    if( pLeft )
6cc0: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
6cd0: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
6ce0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
6cf0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
6d00: 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b   & pLeft->flags;
6d10: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53  .    }.    exprS
6d20: 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b  etHeight(pRoot);
6d30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
6d40: 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e  locate an Expr n
6d50: 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20  ode which joins 
6d60: 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73  as many as two s
6d70: 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  ubtrees..**.** O
6d80: 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
6d90: 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62  e subtrees can b
6da0: 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20  e NULL.  Return 
6db0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6dc0: 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64   new.** Expr nod
6dd0: 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f  e.  Or, if an OO
6de0: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
6df0: 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  set pParse->db->
6e00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a  mallocFailed,.**
6e10: 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65   free the subtre
6e20: 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  es and return NU
6e30: 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  LL..*/.Expr *sql
6e40: 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72  ite3PExpr(.  Par
6e50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6e60: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
6e70: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
6e80: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6e90: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6ea0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
6eb0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
6ec0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
6ed0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
6ee0: 20 2a 70 52 69 67 68 74 20 20 20 20 20 20 20 20   *pRight        
6ef0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
6f00: 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  rand */.){.  Exp
6f10: 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r *p;.  if( op==
6f20: 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73 65  TK_AND && pParse
6f30: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
6f40: 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61   /* Take advanta
6f50: 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63  ge of short-circ
6f60: 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69  uit false optimi
6f70: 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a  zation for AND *
6f80: 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  /.    p = sqlite
6f90: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
6fa0: 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  >db, pLeft, pRig
6fb0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
6fc0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
6fd0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
6fe0: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  e->db, sizeof(Ex
6ff0: 70 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70 20  pr));.    if( p 
7000: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
7010: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  p, 0, sizeof(Exp
7020: 72 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 70  r));.      p->op
7030: 20 3d 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41   = op & TKFLG_MA
7040: 53 4b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 67  SK;.      p->iAg
7050: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d  g = -1;.      p-
7060: 3e 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  >pWin = 0;.    }
7070: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7080: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70  AttachSubtrees(p
7090: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c  Parse->db, p, pL
70a0: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
70b0: 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20  }.  if( p ) {.  
70c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
70d0: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
70e0: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20   p->nHeight);.  
70f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
7100: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65  ./*.** Add pSele
7110: 63 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78  ct to the Expr.x
7120: 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20  .pSelect field. 
7130: 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69 73   Or, if pExpr is
7140: 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f   NULL (due.** do
7150: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
7160: 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68  tion failure) th
7170: 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 70 53  en delete the pS
7180: 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  elect object..*/
7190: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78  .void sqlite3PEx
71a0: 70 72 41 64 64 53 65 6c 65 63 74 28 50 61 72 73  prAddSelect(Pars
71b0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
71c0: 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a  *pExpr, Select *
71d0: 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20  pSelect){.  if( 
71e0: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78  pExpr ){.    pEx
71f0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  pr->x.pSelect = 
7200: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70  pSelect;.    Exp
7210: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
7220: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
7230: 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20  |EP_Subquery);. 
7240: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65     sqlite3ExprSe
7250: 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28  tHeightAndFlags(
7260: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
7270: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
7280: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
7290: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
72a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
72b0: 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  ctDelete(pParse-
72c0: 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  >db, pSelect);. 
72d0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   }.}.../*.** If 
72e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
72f0: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
7300: 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72  TRUE or FALSE (r
7310: 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a  espectively),.**
7320: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20   then return 1. 
7330: 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64   If one cannot d
7340: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75  etermine the tru
7350: 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  th value of the.
7360: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  ** expression at
7370: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65   compile-time re
7380: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  turn 0..**.** Th
7390: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
73a0: 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b  ation.  If is OK
73b0: 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72   to return 0 her
73c0: 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  e even if.** the
73d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c   expression real
73e0: 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  ly is always fal
73f0: 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66  se or false (a f
7400: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a  alse negative)..
7410: 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20 62  ** But it is a b
7420: 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69  ug to return 1 i
7430: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7440: 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66 66   might have diff
7450: 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e  erent.** boolean
7460: 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65   values in diffe
7470: 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63  rent circumstanc
7480: 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69  es (a false posi
7490: 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74  tive.).**.** Not
74a0: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78  e that if the ex
74b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74  pression is part
74c0: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   of conditional 
74d0: 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f  for a.** LEFT JO
74e0: 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e  IN, then we cann
74f0: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20  ot determine at 
7500: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
7510: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69  ther or not.** i
7520: 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c  s it true or fal
7530: 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65  se, so always re
7540: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
7550: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
7560: 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  True(Expr *p){. 
7570: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
7580: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
7590: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
75a0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
75b0: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
75c0: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
75d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
75e0: 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74  eturn v!=0;.}.st
75f0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77  atic int exprAlw
7600: 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70  aysFalse(Expr *p
7610: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a  ){.  int v = 0;.
7620: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
7630: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
7640: 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
7650: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
7660: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c  ExprIsInteger(p,
7670: 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b   &v) ) return 0;
7680: 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a  .  return v==0;.
7690: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
76a0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
76b0: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
76c0: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
76d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
76e0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
76f0: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
7700: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
7710: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
7720: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
7730: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
7740: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
7750: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
7760: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
7770: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
7780: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
7790: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
77a0: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
77b0: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
77c0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
77d0: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  d(sqlite3 *db, E
77e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
77f0: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
7800: 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   pLeft==0 ){.   
7810: 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a   return pRight;.
7820: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
7830: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ht==0 ){.    ret
7840: 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  urn pLeft;.  }el
7850: 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
7860: 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c  sFalse(pLeft) ||
7870: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
7880: 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (pRight) ){.    
7890: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
78a0: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
78b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
78c0: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
78d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
78e0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
78f0: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
7900: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30  lite3IntTokens[0
7910: 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ], 0);.  }else{.
7920: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
7930: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
7940: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
7950: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
7960: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
7970: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
7980: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
7990: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
79a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
79b0: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
79c0: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
79d0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
79e0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
79f0: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
7a00: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
7a10: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
7a20: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
7a30: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
7a40: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
7a50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7a60: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
7a70: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
7a80: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
7a90: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7aa0: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
7ab0: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
7ac0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
7ad0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
7ae0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
7af0: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
7b00: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
7b10: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
7b20: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
7b30: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
7b40: 73 74 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f  st;.  ExprSetPro
7b50: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 48  perty(pNew, EP_H
7b60: 61 73 46 75 6e 63 29 3b 0a 20 20 61 73 73 65 72  asFunc);.  asser
7b70: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
7b80: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
7b90: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
7ba0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
7bb0: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
7bc0: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
7bd0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7be0: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
7bf0: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
7c00: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
7c10: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
7c20: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
7c30: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
7c40: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
7c50: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
7c60: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
7c70: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
7c80: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
7c90: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
7ca0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
7cb0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
7cc0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
7cd0: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
7ce0: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
7cf0: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
7d00: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20 74  is not too big t
7d10: 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c  o avoid a denial
7d20: 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61   of service atta
7d30: 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53  ck when.** the S
7d40: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d  QL statement com
7d50: 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72  es from an exter
7d60: 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a  nal source..**.*
7d70: 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74  * Wildcards of t
7d80: 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20  he form ":aaa", 
7d90: 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61  "@aaa", or "$aaa
7da0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
7db0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
7dc0: 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  * as the previou
7dd0: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  s instance of th
7de0: 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e  e same wildcard.
7df0: 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20    Or if this is 
7e00: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73  the first.** ins
7e10: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c  tance of the wil
7e20: 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20  dcard, the next 
7e30: 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61  sequential varia
7e40: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
7e50: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
7e60: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
7e70: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
7e80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
7e90: 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e 29  r *pExpr, u32 n)
7ea0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
7eb0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
7ed0: 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66 28   ynVar x;..  if(
7ee0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
7ef0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  rn;.  assert( !E
7f00: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7f10: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
7f20: 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  e|EP_Reduced|EP_
7f30: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20  TokenOnly) );.  
7f40: 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
7f50: 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  ken;.  assert( z
7f60: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7f70: 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61 73   z[0]!=0 );.  as
7f80: 73 65 72 74 28 20 6e 3d 3d 28 75 33 32 29 73 71  sert( n==(u32)sq
7f90: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
7fa0: 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d   );.  if( z[1]==
7fb0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  0 ){.    /* Wild
7fc0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
7fd0: 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68   "?".  Assign th
7fe0: 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20  e next variable 
7ff0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73  number */.    as
8000: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20  sert( z[0]=='?' 
8010: 29 3b 0a 20 20 20 20 78 20 3d 20 28 79 6e 56 61  );.    x = (ynVa
8020: 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61  r)(++pParse->nVa
8030: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
8040: 20 69 6e 74 20 64 6f 41 64 64 20 3d 20 30 3b 0a   int doAdd = 0;.
8050: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
8060: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
8070: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
8080: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
8090: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
80a0: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
80b0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
80c0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
80d0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
80e0: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
80f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 32  ;.      if( n==2
8100: 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49   ){ /*OPTIMIZATI
8110: 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20 20  ON-IF-TRUE*/.   
8120: 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d 2d 27 30       i = z[1]-'0
8130: 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  ';  /* The commo
8140: 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20 66 6f 72  n case of ?N for
8150: 20 61 20 73 69 6e 67 6c 65 20 64 69 67 69 74 20   a single digit 
8160: 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6b  N */.        bOk
8170: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
8180: 65 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d  e{.        bOk =
8190: 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36   0==sqlite3Atoi6
81a0: 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31  4(&z[1], &i, n-1
81b0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
81c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
81d0: 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a  stcase( i==0 );.
81e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
81f0: 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  i==1 );.      te
8200: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
8210: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8220: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
8230: 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  ER]-1 );.      t
8240: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
8250: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8260: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
8270: 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66  BER] );.      if
8280: 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20  ( bOk==0 || i<1 
8290: 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  || i>db->aLimit[
82a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
82b0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
82c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
82d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
82e0: 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65   "variable numbe
82f0: 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  r must be betwee
8300: 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20  n ?1 and ?%d",. 
8310: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61             db->a
8320: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8330: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
8340: 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ER]);.        re
8350: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
8360: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 69      x = (ynVar)i
8370: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50  ;.      if( x>pP
8380: 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20  arse->nVar ){.  
8390: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
83a0: 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20 20  ar = (int)x;.   
83b0: 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a       doAdd = 1;.
83c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
83d0: 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54  sqlite3VListNumT
83e0: 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56  oName(pParse->pV
83f0: 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a 20  List, x)==0 ){. 
8400: 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31         doAdd = 1
8410: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8420: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  lse{.      /* Wi
8430: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
8440: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
8450: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
8460: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
8470: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
8480: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
8490: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
84a0: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
84b0: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a  the name.      *
84c0: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
84d0: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
84e0: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
84f0: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
8500: 20 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 28    */.      x = (
8510: 79 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c 69  ynVar)sqlite3VLi
8520: 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61 72  stNameToNum(pPar
8530: 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e  se->pVList, z, n
8540: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d 3d  );.      if( x==
8550: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20 3d  0 ){.        x =
8560: 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73   (ynVar)(++pPars
8570: 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20 20  e->nVar);.      
8580: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
8590: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
85a0: 66 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20 20  f( doAdd ){.    
85b0: 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74    pParse->pVList
85c0: 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74 41   = sqlite3VListA
85d0: 64 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70  dd(db, pParse->p
85e0: 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b  VList, z, n, x);
85f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78  .    }.  }.  pEx
8600: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b  pr->iColumn = x;
8610: 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c 69  .  if( x>db->aLi
8620: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8630: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
8640: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
8650: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8660: 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76   "too many SQL v
8670: 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a  ariables");.  }.
8680: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69  }../*.** Recursi
8690: 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65  vely delete an e
86a0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
86b0: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
86c0: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73  _NOINLINE void s
86d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
86e0: 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  NN(sqlite3 *db, 
86f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73 65  Expr *p){.  asse
8700: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a  rt( p!=0 );.  /*
8710: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41   Sanity check: A
8720: 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49  ssert that the I
8730: 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e  ntValue is non-n
8740: 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78  egative if it ex
8750: 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ists */.  assert
8760: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8770: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
8780: 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75  e) || p->u.iValu
8790: 65 3e 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53  e>=0 );.#ifdef S
87a0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
87b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
87c0: 79 28 70 2c 20 45 50 5f 4c 65 61 66 29 20 26 26  y(p, EP_Leaf) &&
87d0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
87e0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
87f0: 79 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  y) ){.    assert
8800: 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b  ( p->pLeft==0 );
8810: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8820: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
8830: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 53   assert( p->x.pS
8840: 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a  elect==0 );.  }.
8850: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 45 78  #endif.  if( !Ex
8860: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8870: 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45   (EP_TokenOnly|E
8880: 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20  P_Leaf)) ){.    
8890: 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e  /* The Expr.x un
88a0: 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65  ion is never use
88b0: 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  d at the same ti
88c0: 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68  me as Expr.pRigh
88d0: 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
88e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
88f0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
8900: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
8910: 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f  ft && p->op!=TK_
8920: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20  SELECT_COLUMN ) 
8930: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8940: 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  eNN(db, p->pLeft
8950: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  );.    if( p->pR
8960: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
8970: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8980: 4e 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29  N(db, p->pRight)
8990: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
89a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
89b0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
89c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
89d0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
89e0: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
89f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8a00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8a10: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
8a20: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
8a30: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
8a40: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
8a50: 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20  duced) ){.      
8a60: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c  sqlite3WindowDel
8a70: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 6e 29  ete(db, p->pWin)
8a80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8a90: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8aa0: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
8ab0: 29 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  ) ) sqlite3DbFre
8ac0: 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e(db, p->u.zToke
8ad0: 6e 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  n);.  if( !ExprH
8ae0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8af0: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
8b00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
8b10: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  db, p);.  }.}.vo
8b20: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
8b30: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
8b40: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
8b50: 28 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70  ( p ) sqlite3Exp
8b60: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29  rDeleteNN(db, p)
8b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8b80: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8b90: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
8ba0: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
8bb0: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  on structure .**
8bc0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
8bd0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
8be0: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  his is always on
8bf0: 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49  e of EXPR_FULLSI
8c00: 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55  ZE,.** EXPR_REDU
8c10: 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f  CEDSIZE or EXPR_
8c20: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a  TOKENONLYSIZE..*
8c30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
8c40: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
8c50: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
8c60: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8c70: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72  P_TokenOnly) ) r
8c80: 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e  eturn EXPR_TOKEN
8c90: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20  ONLYSIZE;.  if( 
8ca0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8cb0: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  p, EP_Reduced) )
8cc0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44   return EXPR_RED
8cd0: 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75  UCEDSIZE;.  retu
8ce0: 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  rn EXPR_FULLSIZE
8cf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
8d00: 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20  upedExpr*Size() 
8d10: 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65  routines each re
8d20: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8d30: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
8d40: 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20  d.** to store a 
8d50: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
8d60: 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73  ssion or express
8d70: 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20  ion tree.  They 
8d80: 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77  differ in.** how
8d90: 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65   much of the tre
8da0: 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a  e is measured..*
8db0: 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  *.**     dupedEx
8dc0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20  prStructSize()  
8dd0: 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20     Size of only 
8de0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
8df0: 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  re .**     duped
8e00: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20  ExprNodeSize()  
8e10: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70       Size of Exp
8e20: 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f  r + space for to
8e30: 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  ken.**     duped
8e40: 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20  ExprSize()      
8e50: 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65       Expr + toke
8e60: 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70  n + subtree comp
8e70: 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  onents.**.******
8e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ec0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
8ed0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8ee0: 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72  ize() function r
8ef0: 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65  eturns two value
8f00: 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  s OR-ed together
8f10: 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73  :  .** (1) the s
8f20: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
8f30: 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  r a copy of the 
8f40: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f  Expr structure o
8f50: 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20  nly and .** (2) 
8f60: 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73  the EP_xxx flags
8f70: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
8f80: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
8f90: 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  e size should be
8fa0: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
8fb0: 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73  values is always
8fc0: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
8fd0: 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a      EXPR_FULLSIZ
8fe0: 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52  E.**      EXPR_R
8ff0: 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45  EDUCEDSIZE   | E
9000: 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20  P_Reduced.**    
9010: 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59    EXPR_TOKENONLY
9020: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
9030: 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  nly.**.** The si
9040: 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ze of the struct
9050: 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ure can be found
9060: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20   by masking the 
9070: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
9080: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
9090: 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65  with 0xfff.  The
90a0: 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f   flags can be fo
90b0: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
90c0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
90d0: 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63  ue with EP_Reduc
90e0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e  ed|EP_TokenOnly.
90f0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
9100: 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50   with flags==EXP
9110: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69  RDUP_REDUCE, thi
9120: 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73  s routines works
9130: 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a   on full-size.**
9140: 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70   (unreduced) Exp
9150: 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65  r objects as the
9160: 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20  y or originally 
9170: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
9180: 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75  he parser..** Du
9190: 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  ring expression 
91a0: 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20  analysis, extra 
91b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63  information is c
91c0: 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65  omputed and move
91d0: 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20  d into.** later 
91e0: 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70  parts of teh Exp
91f0: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  r object and tha
9200: 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  t extra informat
9210: 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68  ion might get ch
9220: 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20  opped.** off if 
9230: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9240: 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65  s reduced.  Note
9250: 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f   also that it do
9260: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a  es not work to.*
9270: 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55  * make an EXPRDU
9280: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
9290: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
92a0: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
92b0: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
92c0: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
92d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
92e0: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
92f0: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
9300: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
9310: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
9320: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
9330: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
9340: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
9350: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
9360: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
9370: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9380: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9390: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
93a0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
93b0: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
93c0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
93d0: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
93e0: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
93f0: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
9400: 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owed */.  assert
9410: 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c  ( EXPR_FULLSIZE<
9420: 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65  =0xfff );.  asse
9430: 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50  rt( (0xfff & (EP
9440: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
9450: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
9460: 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20  if( 0==flags || 
9470: 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
9480: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6e  _COLUMN ){.    n
9490: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
94a0: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
94b0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
94c0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
94d0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
94e0: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
94f0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9500: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
9510: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
9520: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9530: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
9540: 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20  emToken) );.    
9550: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9560: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
9570: 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20  oReduce) );.    
9580: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
9590: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
95a0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
95b0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
95c0: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
95d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
95e0: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
95f0: 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   );.      nSize 
9600: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
9610: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
9620: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nly;.    }.  }. 
9630: 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d   return nSize;.}
9640: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9650: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
9660: 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  e space in bytes
9670: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
9680: 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20  re the copy .** 
9690: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
96a0: 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79  cture and a copy
96b0: 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a   of the Expr.u.z
96c0: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
96d0: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
96e0: 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a  is defined.).*/.
96f0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
9700: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
9710: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
9720: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
9730: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
9740: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20  ize(p, flags) & 
9750: 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78  0xfff;.  if( !Ex
9760: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9770: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9780: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9790: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
97a0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
97b0: 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d  u.zToken)+1;.  }
97c0: 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
97d0: 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (nByte);.}../*.*
97e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
97f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
9800: 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20  uired to create 
9810: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  a duplicate of t
9820: 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
9830: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
9840: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
9850: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
9860: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b  ent is a.** mask
9870: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52   containing EXPR
9880: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
9890: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
98a0: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
98b0: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
98c0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
98d0: 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74  xpr struct.** it
98e0: 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66  self and the buf
98f0: 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20  fer referred to 
9900: 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  by Expr.u.zToken
9910: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  , if any..**.** 
9920: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
9930: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
9940: 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  t, then the retu
9950: 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65  rn value include
9960: 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64  s .** space to d
9970: 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70  uplicate all Exp
9980: 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74  r nodes in the t
9990: 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78  ree formed by Ex
99a0: 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64  pr.pLeft .** and
99b0: 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72   Expr.pRight var
99c0: 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20  iables (but not 
99d0: 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72  for any structur
99e0: 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72  es pointed to or
99f0: 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66   .** descended f
9a00: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
9a10: 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70  List or Expr.x.p
9a20: 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73  Select variables
9a30: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
9a40: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45   dupedExprSize(E
9a50: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
9a60: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
9a70: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
9a80: 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65      nByte = dupe
9a90: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
9aa0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
9ab0: 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52   flags&EXPRDUP_R
9ac0: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e  EDUCE ){.      n
9ad0: 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70  Byte += dupedExp
9ae0: 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20  rSize(p->pLeft, 
9af0: 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78  flags) + dupedEx
9b00: 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74  prSize(p->pRight
9b10: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
9b20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79    }.  return nBy
9b30: 74 65 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 57 69  te;.}..static Wi
9b40: 6e 64 6f 77 20 2a 77 69 6e 44 75 70 28 73 71 6c  ndow *winDup(sql
9b50: 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77  ite3 *db, Window
9b60: 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a   *p){.  Window *
9b70: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 66 28 20  pNew = 0;.  if( 
9b80: 70 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  p ){.    pNew = 
9b90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
9ba0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  ero(db, sizeof(W
9bb0: 69 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69 66 28  indow));.    if(
9bc0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70   pNew ){.      p
9bd0: 4e 65 77 2d 3e 70 46 69 6c 74 65 72 20 3d 20 73  New->pFilter = s
9be0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
9bf0: 2c 20 70 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29  , p->pFilter, 0)
9c00: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  ;.      pNew->pP
9c10: 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74  artition = sqlit
9c20: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
9c30: 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c  , p->pPartition,
9c40: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
9c50: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
9c60: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
9c70: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
9c80: 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
9c90: 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65  eType = p->eType
9ca0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 45  ;.      pNew->eE
9cb0: 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20  nd = p->eEnd;.  
9cc0: 20 20 20 20 70 4e 65 77 2d 3e 65 53 74 61 72 74      pNew->eStart
9cd0: 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20   = p->eStart;.  
9ce0: 20 20 20 20 70 4e 65 77 2d 3e 70 53 74 61 72 74      pNew->pStart
9cf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
9d00: 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 74 61  p(db, pNew->pSta
9d10: 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  rt, 0);.      pN
9d20: 65 77 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74  ew->pEnd = sqlit
9d30: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e  e3ExprDup(db, pN
9d40: 65 77 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20  ew->pEnd, 0);.  
9d50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9d60: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
9d70: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
9d80: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
9d90: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
9da0: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
9db0: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
9dc0: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
9dd0: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
9de0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
9df0: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
9e00: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
9e10: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
9e20: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
9e30: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
9e40: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
9e50: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
9e60: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
9e70: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
9e80: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
9e90: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
9ea0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
9eb0: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
9ec0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
9ed0: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
9ee0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
9ef0: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
9f00: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
9f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
9f20: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
9f30: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
9f40: 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20  nt dupFlags, u8 
9f50: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
9f60: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
9f70: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
9f80: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20   return */.  u8 
9f90: 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  *zAlloc;        
9fa0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61     /* Memory spa
9fb0: 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  ce from which to
9fc0: 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65   build Expr obje
9fd0: 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74  ct */.  u32 stat
9fe0: 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  icFlag;       /*
9ff0: 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70   EP_Static if sp
a000: 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64  ace not obtained
a010: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a   from malloc */.
a020: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
a030: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20   );.  assert( p 
a040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70  );.  assert( dup
a050: 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46  Flags==0 || dupF
a060: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
a070: 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74  DUCE );.  assert
a080: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
a090: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
a0a0: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20  UP_REDUCE );..  
a0b0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
a0c0: 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
a0d0: 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74   new Expr struct
a0e0: 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a  ure. */.  if( pz
a0f0: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41  Buffer ){.    zA
a100: 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72  lloc = *pzBuffer
a110: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
a120: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
a130: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f  }else{.    zAllo
a140: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
a150: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70  locRawNN(db, dup
a160: 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75  edExprSize(p, du
a170: 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74  pFlags));.    st
a180: 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20  aticFlag = 0;.  
a190: 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72  }.  pNew = (Expr
a1a0: 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66   *)zAlloc;..  if
a1b0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a  ( pNew ){.    /*
a1c0: 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f   Set nNewSize to
a1d0: 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61   the size alloca
a1e0: 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75  ted for the stru
a1f0: 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
a200: 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e  .    ** by pNew.
a210: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
a220: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
a230: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
a240: 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  or.    ** EXPR_T
a250: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
a260: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
a270: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
a280: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
a290: 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f  ** by the copy o
a2a0: 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  f the p->u.zToke
a2b0: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79  n string (if any
a2c0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f  )..    */.    co
a2d0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
a2e0: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
a2f0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
a300: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a310: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
a320: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
a330: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69  e & 0xfff;.    i
a340: 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69  nt nToken;.    i
a350: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a360: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
a370: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
a380: 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b  en ){.      nTok
a390: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
a3a0: 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  en30(p->u.zToken
a3b0: 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  ) + 1;.    }else
a3c0: 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d  {.      nToken =
a3d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
a3e0: 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20  ( dupFlags ){.  
a3f0: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
a400: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
a410: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
a420: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
a430: 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a  lloc, p, nNewSiz
a440: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
a450: 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d       u32 nSize =
a460: 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74   (u32)exprStruct
a470: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d  Size(p);.      m
a480: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
a490: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69   nSize);.      i
a4a0: 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55  f( nSize<EXPR_FU
a4b0: 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20  LLSIZE ){ .     
a4c0: 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f     memset(&zAllo
a4d0: 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50  c[nSize], 0, EXP
a4e0: 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65  R_FULLSIZE-nSize
a4f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a500: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
a510: 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f   EP_Reduced, EP_
a520: 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45  TokenOnly, and E
a530: 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61  P_Static flags a
a540: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f  ppropriately. */
a550: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
a560: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
a570: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
a580: 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f  _Static|EP_MemTo
a590: 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ken);.    pNew->
a5a0: 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74  flags |= nStruct
a5b0: 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63  Size & (EP_Reduc
a5c0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
a5d0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  ;.    pNew->flag
a5e0: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
a5f0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
a600: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
a610: 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ring, if any. */
a620: 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20  .    if( nToken 
a630: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
a640: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
a650: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
a660: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
a670: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
a680: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
a690: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
a6a0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d    }..    if( 0==
a6b0: 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d  ((p->flags|pNew-
a6c0: 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f  >flags) & (EP_To
a6d0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a6e0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
a6f0: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
a700: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
a710: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
a720: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
a730: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a740: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
a750: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a760: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
a770: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a780: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
a790: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a7a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a7b0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
a7c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a7d0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
a7e0: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
a7f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a800: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
a810: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
a820: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
a830: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a840: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
a850: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a860: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  nly) ){.      zA
a870: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a880: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a890: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a8a0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a8b0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a8c0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a8d0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a8e0: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a8f0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a900: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a910: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a920: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a930: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a940: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a950: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a980: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a990: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a9a0: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a9b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a    }.      if( pz
a9c0: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
a9d0: 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41    *pzBuffer = zA
a9e0: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lloc;.      }.  
a9f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
aa00: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
aa10: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
aa20: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29  |EP_TokenOnly) )
aa30: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
aa40: 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  pWin = 0;.      
aa50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
aa60: 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 77 69 6e 44  New->pWin = winD
aa70: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 6e 29 3b  up(db, p->pWin);
aa80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
aa90: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
aaa0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
aab0: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
aac0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
aad0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
aae0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
aaf0: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
ab00: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
ab10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
ab20: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70  >iColumn==0 || p
ab30: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
ab40: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ab50: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c   p->pRight==0  |
ab60: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e  | p->pRight==p->
ab70: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20  pLeft );.       
ab80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ab90: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
aba0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
abb0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
abc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
abd0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
abe0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
abf0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
ac00: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ac10: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
ac20: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
ac30: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
ac40: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
ac50: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
ac60: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
ac70: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
ac80: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
ac90: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
aca0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
acb0: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
acc0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
acd0: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
ace0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
acf0: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
ad00: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
ad10: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
ad20: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
ad30: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
ad40: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
ad50: 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28  of(*p) + sizeof(
ad60: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
ad70: 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74  Cte-1);.    pRet
ad80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
ad90: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
ada0: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  );.    if( pRet 
adb0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
adc0: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65        pRet->nCte
add0: 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20   = p->nCte;.    
ade0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
adf0: 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
ae00: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70      pRet->a[i].p
ae10: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
ae20: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
ae30: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30  >a[i].pSelect, 0
ae40: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
ae50: 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71  >a[i].pCols = sq
ae60: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
ae70: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f  (db, p->a[i].pCo
ae80: 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ls, 0);.        
ae90: 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pRet->a[i].zName
aea0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
aeb0: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  up(db, p->a[i].z
aec0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
aed0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
aee0: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
aef0: 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70  # define withDup
af00: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a  (x,y) 0.#endif..
af10: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
af20: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
af30: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
af40: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
af50: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
af60: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
af70: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
af80: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
af90: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
afa0: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
afb0: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
afc0: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
afd0: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
afe0: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
aff0: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
b000: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
b010: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
b020: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
b030: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
b040: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
b050: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
b060: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
b070: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
b080: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
b090: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
b0a0: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
b0b0: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
b0c0: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
b0d0: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
b0e0: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
b0f0: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
b100: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
b110: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
b120: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
b130: 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
b140: 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74  tains a combinat
b150: 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44  ion of the EXPRD
b160: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
b170: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
b180: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
b190: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
b1a0: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
b1b0: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
b1c0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
b1d0: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
b1e0: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
b1f0: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
b200: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
b210: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
b220: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
b230: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
b240: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
b250: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
b260: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
b270: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
b280: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
b290: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
b2a0: 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  CE );.  return p
b2b0: 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   ? exprDup(db, p
b2c0: 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b  , flags, 0) : 0;
b2d0: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
b2e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
b2f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
b300: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
b310: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
b320: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
b330: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
b340: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
b350: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
b360: 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43  r *pPriorSelectC
b370: 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ol = 0;.  assert
b380: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
b390: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
b3a0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
b3b0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
b3c0: 64 62 2c 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  db, sqlite3DbMal
b3d0: 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 29 29 3b  locSize(db, p));
b3e0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
b3f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b400: 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45  w->nExpr = p->nE
b410: 78 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  xpr;.  pItem = p
b420: 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74  New->a;.  pOldIt
b430: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
b440: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
b450: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
b460: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
b470: 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20   Expr *pOldExpr 
b480: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70  = pOldItem->pExp
b490: 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  r;.    Expr *pNe
b4a0: 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  wExpr;.    pItem
b4b0: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
b4c0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
b4d0: 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20  dExpr, flags);. 
b4e0: 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 20     if( pOldExpr 
b4f0: 0a 20 20 20 20 20 26 26 20 70 4f 6c 64 45 78 70  .     && pOldExp
b500: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
b510: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20  _COLUMN.     && 
b520: 28 70 4e 65 77 45 78 70 72 20 3d 20 70 49 74 65  (pNewExpr = pIte
b530: 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a 20 20  m->pExpr)!=0 .  
b540: 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
b550: 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f  t( pNewExpr->iCo
b560: 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29  lumn==0 || i>0 )
b570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
b580: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30  Expr->iColumn==0
b590: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
b5a0: 72 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c  rt( pOldExpr->pL
b5b0: 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70  eft==pOldExpr->p
b5c0: 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20  Right );.       
b5d0: 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c   pPriorSelectCol
b5e0: 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65   = pNewExpr->pLe
b5f0: 66 74 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70  ft = pNewExpr->p
b600: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c  Right;.      }el
b610: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
b620: 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
b630: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
b640: 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  [-1].pExpr!=0 );
b650: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b660: 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75   pNewExpr->iColu
b670: 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45  mn==pItem[-1].pE
b680: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29  xpr->iColumn+1 )
b690: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b6a0: 28 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f  ( pPriorSelectCo
b6b0: 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78  l==pItem[-1].pEx
b6c0: 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20  pr->pLeft );.   
b6d0: 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d 3e 70       pNewExpr->p
b6e0: 4c 65 66 74 20 3d 20 70 50 72 69 6f 72 53 65 6c  Left = pPriorSel
b6f0: 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a  ectCol;.      }.
b700: 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d      }.    pItem-
b710: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
b720: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b730: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
b740: 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20     pItem->zSpan 
b750: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b760: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b770: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
b780: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  m->sortOrder = p
b790: 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  OldItem->sortOrd
b7a0: 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64  er;.    pItem->d
b7b0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  one = 0;.    pIt
b7c0: 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  em->bSpanIsTab =
b7d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e   pOldItem->bSpan
b7e0: 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d  IsTab;.    pItem
b7f0: 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d 20 70  ->bSorterRef = p
b800: 4f 6c 64 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72  OldItem->bSorter
b810: 52 65 66 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  Ref;.    pItem->
b820: 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b  u = pOldItem->u;
b830: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
b840: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ew;.}../*.** If 
b850: 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72  cursors, trigger
b860: 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  s, views and sub
b870: 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20  queries are all 
b880: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  omitted from.** 
b890: 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  the build, then 
b8a0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  none of the foll
b8b0: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20  owing routines, 
b8c0: 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73  except for .** s
b8d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b8e0: 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ), can be called
b8f0: 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  . sqlite3SelectD
b900: 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65  up() is sometime
b910: 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68  s.** called with
b920: 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74   a NULL argument
b930: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
b940: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
b950: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
b960: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
b970: 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69  GER) \. || !defi
b980: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b990: 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73  SUBQUERY).SrcLis
b9a0: 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
b9b0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
b9c0: 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e  , SrcList *p, in
b9d0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c  t flags){.  SrcL
b9e0: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
b9f0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   i;.  int nByte;
ba00: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
ba10: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
ba20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
ba30: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
ba40: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
ba50: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
ba60: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
ba70: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
ba80: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
ba90: 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
baa0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
bab0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
bac0: 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  nSrc = pNew->nAl
bad0: 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20  loc = p->nSrc;. 
bae0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
baf0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
bb00: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
bb10: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
bb20: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
bb30: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
bb40: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
bb50: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61  &p->a[i];.    Ta
bb60: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
bb70: 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61  NewItem->pSchema
bb80: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63   = pOldItem->pSc
bb90: 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74  hema;.    pNewIt
bba0: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
bbb0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
bbc0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44  db, pOldItem->zD
bbd0: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e  atabase);.    pN
bbe0: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
bbf0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
bc00: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
bc10: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
bc20: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
bc30: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bc40: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61   pOldItem->zAlia
bc50: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
bc60: 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ->fg = pOldItem-
bc70: 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  >fg;.    pNewIte
bc80: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
bc90: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
bca0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64      pNewItem->ad
bcb0: 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64  drFillSub = pOld
bcc0: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
bcd0: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
bce0: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c  >regReturn = pOl
bcf0: 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  dItem->regReturn
bd00: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74  ;.    if( pNewIt
bd10: 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  em->fg.isIndexed
bd20: 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  By ){.      pNew
bd30: 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
bd40: 64 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53  dBy = sqlite3DbS
bd50: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
bd60: 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
bd70: 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  y);.    }.    pN
bd80: 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78  ewItem->pIBIndex
bd90: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42   = pOldItem->pIB
bda0: 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
bdb0: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  NewItem->fg.isTa
bdc0: 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70  bFunc ){.      p
bdd0: 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  NewItem->u1.pFun
bde0: 63 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20  cArg = .        
bdf0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
be00: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
be10: 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20  m->u1.pFuncArg, 
be20: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
be30: 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65    pTab = pNewIte
be40: 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74  m->pTab = pOldIt
be50: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
be60: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
be70: 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b  pTab->nTabRef++;
be80: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
be90: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
bea0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
beb0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  db, pOldItem->pS
bec0: 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20  elect, flags);. 
bed0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
bee0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
bef0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
bf00: 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  pOn, flags);.   
bf10: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e   pNewItem->pUsin
bf20: 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  g = sqlite3IdLis
bf30: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
bf40: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m->pUsing);.    
bf50: 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pNewItem->colUse
bf60: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f  d = pOldItem->co
bf70: 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74  lUsed;.  }.  ret
bf80: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
bf90: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
bfa0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
bfb0: 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20  , IdList *p){.  
bfc0: 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  IdList *pNew;.  
bfd0: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
bfe0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
bff0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
c000: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
c010: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
c020: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
c030: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
c040: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
c050: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
c060: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
c070: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c080: 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  awNN(db, p->nId*
c090: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
c0a0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
c0b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
c0c0: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
c0d0: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
c0e0: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74   0;.  }.  /* Not
c0f0: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74  e that because t
c100: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
c110: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d  llocation for p-
c120: 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  >a[] is not.  **
c130: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70   necessarily a p
c140: 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c  ower of two, sql
c150: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
c160: 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  () may not be ca
c170: 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lled.  ** on the
c180: 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74   duplicate creat
c190: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
c1a0: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
c1b0: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
c1c0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
c1d0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
c1e0: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
c1f0: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
c200: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
c210: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
c220: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
c230: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
c240: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
c250: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
c260: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
c270: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
c280: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
c290: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
c2a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
c2b0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
c2c0: 20 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67   *pDup, int flag
c2d0: 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52  s){.  Select *pR
c2e0: 65 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74  et = 0;.  Select
c2f0: 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53   *pNext = 0;.  S
c300: 65 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52  elect **pp = &pR
c310: 65 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  et;.  Select *p;
c320: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
c330: 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75  0 );.  for(p=pDu
c340: 70 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f  p; p; p=p->pPrio
c350: 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
c360: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
c370: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
c380: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
c390: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
c3a0: 62 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d  break;.    pNew-
c3b0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
c3c0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c3d0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67   p->pEList, flag
c3e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53  s);.    pNew->pS
c3f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
c400: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  istDup(db, p->pS
c410: 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rc, flags);.    
c420: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73  pNew->pWhere = s
c430: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
c440: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61  , p->pWhere, fla
c450: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c460: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
c470: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c480: 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c   p->pGroupBy, fl
c490: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c4a0: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
c4b0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
c4c0: 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b  pHaving, flags);
c4d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  .    pNew->pOrde
c4e0: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
c4f0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
c500: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
c510: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ;.    pNew->op =
c520: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77   p->op;.    pNew
c530: 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b  ->pNext = pNext;
c540: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  .    pNew->pPrio
c550: 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  r = 0;.    pNew-
c560: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
c570: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
c580: 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a  pLimit, flags);.
c590: 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74      pNew->iLimit
c5a0: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
c5b0: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  iOffset = 0;.   
c5c0: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
c5d0: 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  = p->selFlags & 
c5e0: 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61  ~SF_UsesEphemera
c5f0: 6c 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  l;.    pNew->add
c600: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d  rOpenEphm[0] = -
c610: 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  1;.    pNew->add
c620: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
c630: 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65  1;.    pNew->nSe
c640: 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65  lectRow = p->nSe
c650: 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65  lectRow;.    pNe
c660: 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44  w->pWith = withD
c670: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29  up(db, p->pWith)
c680: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e  ;.    pNew->pWin
c690: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
c6a0: 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
c6b0: 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65  New, p->zSelName
c6c0: 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 4e 65  );.    *pp = pNe
c6d0: 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70 4e 65  w;.    pp = &pNe
c6e0: 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  w->pPrior;.    p
c6f0: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  Next = pNew;.  }
c700: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
c710: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
c720: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
c730: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
c740: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
c750: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
c760: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
c770: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
c780: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
c790: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
c7a0: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
c7b0: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
c7c0: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
c7d0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
c7e0: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
c7f0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
c800: 2a 20 54 68 65 20 70 4c 69 73 74 20 61 72 67 75  * The pList argu
c810: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 69 74  ment must be eit
c820: 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 70 6f  her NULL or a po
c830: 69 6e 74 65 72 20 74 6f 20 61 6e 20 45 78 70 72  inter to an Expr
c840: 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  List.** obtained
c850: 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 61   from a prior ca
c860: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ll to sqlite3Exp
c870: 72 4c 69 73 74 41 70 70 65 6e 64 28 29 2e 20 20  rListAppend().  
c880: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
c890: 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20  may not be used 
c8a0: 77 69 74 68 20 61 6e 20 45 78 70 72 4c 69 73 74  with an ExprList
c8b0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
c8c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
c8d0: 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f 6e 3a 20  p()..** Reason: 
c8e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
c8f0: 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 6e  sumes that the n
c900: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69  umber of slots i
c910: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a 2a 2a 20  n pList->a[].** 
c920: 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  is a power of tw
c930: 6f 2e 20 20 54 68 61 74 20 69 73 20 74 72 75 65  o.  That is true
c940: 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72   for sqlite3Expr
c950: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 65 74  ListAppend() ret
c960: 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69 73 20 6e  urns.** but is n
c970: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74  ot necessarily t
c980: 72 75 65 20 66 72 6f 6d 20 74 68 65 20 72 65 74  rue from the ret
c990: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
c9a0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
c9b0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  )..**.** If a me
c9c0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
c9d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
c9e0: 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73  e entire list is
c9f0: 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55   freed and.** NU
ca00: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  LL is returned. 
ca10: 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20   If non-NULL is 
ca20: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69  returned, then i
ca30: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  t is guaranteed.
ca40: 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
ca50: 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73  entry was succes
ca60: 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e  sfully appended.
ca70: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
ca80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
ca90: 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
caa0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
cab0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
cac0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
cad0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
cae0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
caf0: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
cb00: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
cb10: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
cb20: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
cb30: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
cb40: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
cb50: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  L */.){.  struct
cb60: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
cb70: 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
cb80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
cb90: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
cba0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
cbb0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
cbc0: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
cbd0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
cbe0: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
cbf0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
cc00: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
cc10: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
cc20: 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d    pList->nExpr =
cc30: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
cc40: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20  (pList->nExpr & 
cc50: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  (pList->nExpr-1)
cc60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  )==0 ){.    Expr
cc70: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
cc80: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
cc90: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
cca0: 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
ccb0: 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 2b   sizeof(*pList)+
ccc0: 28 32 2a 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  (2*pList->nExpr 
ccd0: 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  - 1)*sizeof(pLis
cce0: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
ccf0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
cd00: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
cd10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
cd20: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
cd30: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
cd40: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
cd50: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
cd60: 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72  etof(struct Expr
cd70: 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29  List_item,zName)
cd80: 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65 6d 2d 3e  ==sizeof(pItem->
cd90: 70 45 78 70 72 29 20 29 3b 0a 20 20 61 73 73 65  pExpr) );.  asse
cda0: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74 72  rt( offsetof(str
cdb0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cdc0: 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29 3b 0a 20  m,pExpr)==0 );. 
cdd0: 20 6d 65 6d 73 65 74 28 26 70 49 74 65 6d 2d 3e   memset(&pItem->
cde0: 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f 66 28 2a  zName,0,sizeof(*
cdf0: 70 49 74 65 6d 29 2d 6f 66 66 73 65 74 6f 66 28  pItem)-offsetof(
ce00: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ce10: 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b 0a 20 20  item,zName));.  
ce20: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
ce30: 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  Expr;.  return p
ce40: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
ce50: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
ce60: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
ce70: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
ce80: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
ce90: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
cea0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
ceb0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
cec0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
ced0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
cee0: 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78  pColumns and pEx
cef0: 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72  pr form a vector
cf00: 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63   assignment whic
cf10: 68 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  h is part of the
cf20: 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f   SET.** clause o
cf30: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
cf40: 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69  ement.  Like thi
cf50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
cf60: 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31  (a,b,c) = (expr1
cf70: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
cf80: 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20   Or:    (a,b,c) 
cf90: 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20  = (SELECT x,y,z 
cfa0: 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  FROM ....).**.**
cfb0: 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   For each term o
cfc0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73  f the vector ass
cfd0: 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20  ignment, append 
cfe0: 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74  new entries to t
cff0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
d000: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e   list pList.  In
d010: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73   the case of a s
d020: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 52  ubquery on the R
d030: 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b  HS, append.** TK
d040: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65  _SELECT_COLUMN e
d050: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45  xpressions..*/.E
d060: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
d070: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65  ExprListAppendVe
d080: 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ctor(.  Parse *p
d090: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
d0a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d0b0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
d0c0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  *pList,       /*
d0d0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
d0e0: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
d0f0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c  be NULL */.  IdL
d100: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20  ist *pColumns,  
d110: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e      /* List of n
d120: 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74  ames of LHS of t
d130: 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f  he assignment */
d140: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
d150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63            /* Vec
d160: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74  tor expression t
d170: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
d180: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
d190: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
d1a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
d1b0: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b   int n;.  int i;
d1c0: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
d1d0: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
d1e0: 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70  Expr : 0;.  /* p
d1f0: 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79  Columns can only
d200: 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20   be NULL due to 
d210: 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f  an OOM but an OO
d220: 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a  M will cause an.
d230: 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20    ** exit prior 
d240: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
d250: 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f  being invoked */
d260: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f  .  if( NEVER(pCo
d270: 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f  lumns==0) ) goto
d280: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
d290: 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70  rror;.  if( pExp
d2a0: 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74  r==0 ) goto vect
d2b0: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
d2c0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48  ..  /* If the RH
d2d0: 53 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 74  S is a vector, t
d2e0: 68 65 6e 20 77 65 20 63 61 6e 20 69 6d 6d 65 64  hen we can immed
d2f0: 69 61 74 65 6c 79 20 63 68 65 63 6b 20 74 6f 20  iately check to 
d300: 73 65 65 20 74 68 61 74 20 0a 20 20 2a 2a 20 74  see that .  ** t
d310: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 52  he size of the R
d320: 48 53 20 61 6e 64 20 4c 48 53 20 6d 61 74 63 68  HS and LHS match
d330: 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 52 48  .  But if the RH
d340: 53 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 0a  S is a SELECT, .
d350: 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 73 20 28    ** wildcards (
d360: 22 2a 22 29 20 69 6e 20 74 68 65 20 72 65 73 75  "*") in the resu
d370: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
d380: 4c 45 43 54 20 6d 75 73 74 20 62 65 20 65 78 70  LECT must be exp
d390: 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 20 20 2a  anded before.  *
d3a0: 2a 20 77 65 20 63 61 6e 20 64 6f 20 74 68 65 20  * we can do the 
d3b0: 73 69 7a 65 20 63 68 65 63 6b 2c 20 73 6f 20 64  size check, so d
d3c0: 65 66 65 72 20 74 68 65 20 73 69 7a 65 20 63 68  efer the size ch
d3d0: 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  eck until code g
d3e0: 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  eneration..  */.
d3f0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
d400: 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 43  =TK_SELECT && pC
d410: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 28 6e 3d  olumns->nId!=(n=
d420: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
d430: 72 53 69 7a 65 28 70 45 78 70 72 29 29 20 29 7b  rSize(pExpr)) ){
d440: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
d450: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
d460: 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
d470: 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c    pColumns->nId,
d4a0: 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65   n);.    goto ve
d4b0: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
d4c0: 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  r;.  }..  for(i=
d4d0: 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73 2d 3e 6e  0; i<pColumns->n
d4e0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  Id; i++){.    Ex
d4f0: 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73  pr *pSubExpr = s
d500: 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63  qlite3ExprForVec
d510: 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c  torField(pParse,
d520: 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20   pExpr, i);.    
d530: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
d540: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
d550: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75  arse, pList, pSu
d560: 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  bExpr);.    if( 
d570: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61  pList ){.      a
d580: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
d590: 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20  xpr==iFirst+i+1 
d5a0: 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  );.      pList->
d5b0: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
d5c0: 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d  ].zName = pColum
d5d0: 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  ns->a[i].zName;.
d5e0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e        pColumns->
d5f0: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[i].zName = 0;.
d600: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
d610: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
d620: 65 64 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  ed && pExpr->op=
d630: 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 41 4c  =TK_SELECT && AL
d640: 57 41 59 53 28 70 4c 69 73 74 21 3d 30 29 20 29  WAYS(pList!=0) )
d650: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 46 69 72  {.    Expr *pFir
d660: 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 46  st = pList->a[iF
d670: 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20 20 20  irst].pExpr;.   
d680: 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74 21   assert( pFirst!
d690: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d6a0: 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d 54 4b  ( pFirst->op==TK
d6b0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
d6c0: 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53  ;.     .    /* S
d6d0: 74 6f 72 65 20 74 68 65 20 53 45 4c 45 43 54 20  tore the SELECT 
d6e0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 70 52 69  statement in pRi
d6f0: 67 68 74 20 73 6f 20 69 74 20 77 69 6c 6c 20 62  ght so it will b
d700: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 0a 20  e deleted when. 
d710: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70     ** sqlite3Exp
d720: 72 4c 69 73 74 44 65 6c 65 74 65 28 29 20 69 73  rListDelete() is
d730: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 70   called */.    p
d740: 46 69 72 73 74 2d 3e 70 52 69 67 68 74 20 3d 20  First->pRight = 
d750: 70 45 78 70 72 3b 0a 20 20 20 20 70 45 78 70 72  pExpr;.    pExpr
d760: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65   = 0;..    /* Re
d770: 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a 65 20  member the size 
d780: 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 69 54  of the LHS in iT
d790: 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77 65 20  able so that we 
d7a0: 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74 0a 20  can check that. 
d7b0: 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 61 6e     ** the RHS an
d7c0: 64 20 4c 48 53 20 73 69 7a 65 73 20 6d 61 74 63  d LHS sizes matc
d7d0: 68 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65  h during code ge
d7e0: 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  neration. */.   
d7f0: 20 70 46 69 72 73 74 2d 3e 69 54 61 62 6c 65 20   pFirst->iTable 
d800: 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b  = pColumns->nId;
d810: 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70  .  }..vector_app
d820: 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  end_error:.  sql
d830: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
d840: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c  b, pExpr);.  sql
d850: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
d860: 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a  (db, pColumns);.
d870: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
d880: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
d890: 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20   sort order for 
d8a0: 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
d8b0: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 45 78   on the given Ex
d8c0: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  prList..*/.void 
d8d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
d8e0: 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78 70 72  etSortOrder(Expr
d8f0: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f  List *p, int iSo
d900: 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66 28 20  rtOrder){.  if( 
d910: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
d920: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
d930: 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20 26  SO_UNDEFINED<0 &
d940: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e  & SQLITE_SO_ASC>
d950: 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f  =0 && SQLITE_SO_
d960: 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73 65  DESC>0 );.  asse
d970: 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29  rt( p->nExpr>0 )
d980: 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64  ;.  if( iSortOrd
d990: 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73 73 65  er<0 ){.    asse
d9a0: 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70  rt( p->a[p->nExp
d9b0: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d  r-1].sortOrder==
d9c0: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b  SQLITE_SO_ASC );
d9d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d9e0: 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  .  p->a[p->nExpr
d9f0: 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  -1].sortOrder = 
da00: 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a  (u8)iSortOrder;.
da10: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
da20: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e   ExprList.a[].zN
da30: 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ame element of t
da40: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
da50: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
da60: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
da70: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
da80: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
da90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
daa0: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e  M error.  But pN
dab0: 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  ame should never
dac0: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
dad0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
dae0: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
daf0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
db00: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
db10: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
db20: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
db30: 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  SetName(.  Parse
db40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
db50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
db60: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
db70: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
db80: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
db90: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
dba0: 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pan. */.  Token 
dbb0: 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
dbc0: 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20    /* Name to be 
dbd0: 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  added */.  int d
dbe0: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
dbf0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61     /* True to ca
dc00: 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20  use the name to 
dc10: 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29  be dequoted */.)
dc20: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  {.  assert( pLis
dc30: 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  t!=0 || pParse->
dc40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
dc50: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
dc60: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
dc70: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
dc80: 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  pItem;.    asser
dc90: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
dca0: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
dcb0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
dcc0: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
dcd0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a  assert( pItem->z
dce0: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
dcf0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
dd00: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
dd10: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
dd20: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
dd30: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
dd40: 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65  ) sqlite3Dequote
dd50: 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
dd60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
dd70: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
dd80: 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20  ].zSpan element 
dd90: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
dda0: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
ddb0: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
ddc0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
ddd0: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
dde0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
ddf0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
de00: 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e  t pSpan should n
de10: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
de20: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
de30: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
de40: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
de50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
de60: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
de70: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
de80: 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50  ListSetSpan(.  P
de90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
dea0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
deb0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
dec0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
ded0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
dee0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
def0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f  he span. */.  co
df00: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74  nst char *zStart
df10: 2c 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f  ,     /* Start o
df20: 66 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20  f the span */.  
df30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64  const char *zEnd
df40: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
df50: 66 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 29 7b  f the span */.){
df60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
df70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
df80: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
df90: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
dfa0: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
dfb0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
dfc0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
dfd0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
dfe0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
dff0: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
e000: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
e010: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
e020: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
e030: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
e040: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
e050: 74 65 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c  te3DbSpanDup(db,
e060: 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a   zStart, zEnd);.
e070: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
e080: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
e090: 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61  ist pEList conta
e0a0: 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c  ins more than iL
e0b0: 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a  imit elements,.*
e0c0: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
e0d0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
e0e0: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
e0f0: 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
e100: 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20  Length(.  Parse 
e110: 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c  *pParse,.  ExprL
e120: 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63  ist *pEList,.  c
e130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65  onst char *zObje
e140: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d  ct.){.  int mx =
e150: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
e160: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
e170: 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74  _COLUMN];.  test
e180: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
e190: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
e1a0: 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  x );.  testcase(
e1b0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
e1c0: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29  t->nExpr==mx+1 )
e1d0: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26  ;.  if( pEList &
e1e0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
e1f0: 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mx ){.    sqlite
e200: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e210: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
e220: 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a  mns in %s", zObj
e230: 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ect);.  }.}../*.
e240: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
e250: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
e260: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ist..*/.static S
e270: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
e280: 6f 69 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65  oid exprListDele
e290: 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62  teNN(sqlite3 *db
e2a0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
e2b0: 74 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c  t){.  int i = pL
e2c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74  ist->nExpr;.  st
e2d0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
e2e0: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69  em *pItem =  pLi
e2f0: 73 74 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74 28  st->a;.  assert(
e300: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
e310: 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  );.  do{.    sql
e320: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
e330: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
e340: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e350: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e360: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
e370: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
e380: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
e390: 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c  pItem++;.  }whil
e3a0: 65 28 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71  e( --i>0 );.  sq
e3b0: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
e3c0: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64  , pList);.}.void
e3d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e3e0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
e3f0: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
e400: 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ist){.  if( pLis
e410: 74 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65  t ) exprListDele
e420: 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b  teNN(db, pList);
e430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e440: 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20   the bitwise-OR 
e450: 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67  of all Expr.flag
e460: 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  s fields in the 
e470: 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73  given.** ExprLis
e480: 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  t..*/.u32 sqlite
e490: 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63  3ExprListFlags(c
e4a0: 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70  onst ExprList *p
e4b0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
e4c0: 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 61    u32 m = 0;.  a
e4d0: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
e4e0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
e4f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
e500: 2b 29 7b 0a 20 20 20 20 20 45 78 70 72 20 2a 70  +){.     Expr *p
e510: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
e520: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 61  i].pExpr;.     a
e530: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
e540: 29 3b 0a 20 20 20 20 20 6d 20 7c 3d 20 70 45 78  );.     m |= pEx
e550: 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20  pr->flags;.  }. 
e560: 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a   return m;.}../*
e570: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 53 45  .** This is a SE
e580: 4c 45 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61  LECT-node callba
e590: 63 6b 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ck for the expre
e5a0: 73 73 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61  ssion walker tha
e5b0: 74 0a 2a 2a 20 61 6c 77 61 79 73 20 22 66 61 69  t.** always "fai
e5c0: 6c 73 22 2e 20 20 42 79 20 22 66 61 69 6c 22 20  ls".  By "fail" 
e5d0: 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 77 65  in this case, we
e5e0: 20 6d 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61   mean set.** pWa
e5f0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a  lker->eCode to z
e600: 65 72 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a  ero and abort..*
e610: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61  *.** This callba
e620: 63 6b 20 69 73 20 75 73 65 64 20 62 79 20 6d 75  ck is used by mu
e630: 6c 74 69 70 6c 65 20 65 78 70 72 65 73 73 69 6f  ltiple expressio
e640: 6e 20 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e  n walkers..*/.in
e650: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  t sqlite3SelectW
e660: 61 6c 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a  alkFail(Walker *
e670: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
e680: 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
e690: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
e6a0: 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65  tUsed);.  pWalke
e6b0: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
e6c0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
e6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
e6e0: 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69  e input expressi
e6f0: 6f 6e 20 69 73 20 61 6e 20 49 44 20 77 69 74 68  on is an ID with
e700: 20 74 68 65 20 6e 61 6d 65 20 22 74 72 75 65 22   the name "true"
e710: 20 6f 72 20 22 66 61 6c 73 65 22 0a 2a 2a 20 74   or "false".** t
e720: 68 65 6e 20 63 6f 6e 76 65 72 74 20 69 74 20 69  hen convert it i
e730: 6e 74 6f 20 61 6e 20 54 4b 5f 54 52 55 45 46 41  nto an TK_TRUEFA
e740: 4c 53 45 20 74 65 72 6d 2e 20 20 52 65 74 75 72  LSE term.  Retur
e750: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a  n non-zero if.**
e760: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
e770: 68 61 70 70 65 6e 65 64 2c 20 61 6e 64 20 7a 65  happened, and ze
e780: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
e790: 73 69 6f 6e 20 69 73 20 75 6e 61 6c 74 65 72 65  sion is unaltere
e7a0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
e7b0: 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c  3ExprIdToTrueFal
e7c0: 73 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  se(Expr *pExpr){
e7d0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e7e0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70  ->op==TK_ID || p
e7f0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  Expr->op==TK_STR
e800: 49 4e 47 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ING );.  if( sql
e810: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
e820: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 74 72  r->u.zToken, "tr
e830: 75 65 22 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 71  ue")==0.   || sq
e840: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78  lite3StrICmp(pEx
e850: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66  pr->u.zToken, "f
e860: 61 6c 73 65 22 29 3d 3d 30 0a 20 20 29 7b 0a 20  alse")==0.  ){. 
e870: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
e880: 4b 5f 54 52 55 45 46 41 4c 53 45 3b 0a 20 20 20  K_TRUEFALSE;.   
e890: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
e8a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e8b0: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
e8c0: 20 6d 75 73 74 20 62 65 20 61 20 54 4b 5f 54 52   must be a TK_TR
e8d0: 55 45 46 41 4c 53 45 20 45 78 70 72 20 6e 6f 64  UEFALSE Expr nod
e8e0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
e8f0: 69 74 20 69 73 20 54 52 55 45 0a 2a 2a 20 61 6e  it is TRUE.** an
e900: 64 20 30 20 69 66 20 69 74 20 69 73 20 46 41 4c  d 0 if it is FAL
e910: 53 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  SE..*/.int sqlit
e920: 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
e930: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78  (const Expr *pEx
e940: 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  pr){.  assert( p
e950: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55  Expr->op==TK_TRU
e960: 45 46 41 4c 53 45 20 29 3b 0a 20 20 61 73 73 65  EFALSE );.  asse
e970: 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  rt( sqlite3StrIC
e980: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
e990: 65 6e 2c 22 74 72 75 65 22 29 3d 3d 30 0a 20 20  en,"true")==0.  
e9a0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53       || sqlite3S
e9b0: 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
e9c0: 7a 54 6f 6b 65 6e 2c 22 66 61 6c 73 65 22 29 3d  zToken,"false")=
e9d0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
e9e0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34  Expr->u.zToken[4
e9f0: 5d 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ]==0;.}.../*.** 
ea00: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
ea10: 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61  re Walker callba
ea20: 63 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65 63  cks used to chec
ea30: 6b 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f  k expressions to
ea40: 0a 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79 20  .** see if they 
ea50: 61 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66  are "constant" f
ea60: 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69  or some definiti
ea70: 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20  on of constant. 
ea80: 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65   The.** Walker.e
ea90: 43 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65 72  Code value deter
eaa0: 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f  mines the type o
eab0: 66 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20  f "constant" we 
eac0: 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66  are looking.** f
ead0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  or..**.** These 
eae0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
eaf0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d  s are used to im
eb00: 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c  plement the foll
eb10: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
eb20: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
eb30: 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20  nstant()        
eb40: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
eb50: 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20  r->eCode==1.**  
eb60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
eb70: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
eb80: 29 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c  )           pWal
eb90: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a  ker->eCode==2.**
eba0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ebb0: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
ebc0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57  )             pW
ebd0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a  alker->eCode==3.
ebe0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
ebf0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
ec00: 6e 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20  nction()        
ec10: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
ec20: 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20  4 or 5.**.** In 
ec30: 61 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63  all cases, the c
ec40: 61 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c  allbacks set Wal
ec50: 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20  ker.eCode=0 and 
ec60: 61 62 6f 72 74 20 69 66 20 74 68 65 20 65 78 70  abort if the exp
ec70: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f  ression.** is fo
ec80: 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20  und to not be a 
ec90: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  constant..**.** 
eca0: 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  The sqlite3ExprI
ecb0: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
ecc0: 69 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f  ion() is used fo
ecd0: 72 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70  r evaluating exp
ece0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61  ressions.** in a
ecf0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
ed00: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61  atement.  The Wa
ed10: 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65  lker.eCode value
ed20: 20 69 73 20 35 20 77 68 65 6e 20 70 61 72 73 69   is 5 when parsi
ed30: 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e  ng.** an existin
ed40: 67 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77  g schema and 4 w
ed50: 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  hen processing a
ed60: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20   new statement. 
ed70: 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61   A bound.** para
ed80: 6d 65 74 65 72 20 72 61 69 73 65 73 20 61 6e 20  meter raises an 
ed90: 65 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74  error for new st
eda0: 61 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73  atements, but is
edb0: 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   silently conver
edc0: 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66  ted.** to NULL f
edd0: 6f 72 20 65 78 69 73 74 69 6e 67 20 73 63 68 65  or existing sche
ede0: 6d 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  mas.  This allow
edf0: 73 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  s sqlite_master 
ee00: 74 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20  tables that .** 
ee10: 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20  contain a bound 
ee20: 70 61 72 61 6d 65 74 65 72 20 62 65 63 61 75 73  parameter becaus
ee30: 65 20 74 68 65 79 20 77 65 72 65 20 67 65 6e 65  e they were gene
ee40: 72 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76  rated by older v
ee50: 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
ee60: 4c 69 74 65 20 74 6f 20 62 65 20 70 61 72 73 65  Lite to be parse
ee70: 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69  d by newer versi
ee80: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69  ons of SQLite wi
ee90: 74 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a  thout raising a.
eea0: 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68  ** malformed sch
eeb0: 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  ema error..*/.st
eec0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
eed0: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
eee0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
eef0: 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a  r *pExpr){..  /*
ef00: 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f   If pWalker->eCo
ef10: 64 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79  de is 2 then any
ef20: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70   term of the exp
ef30: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d  ression that com
ef40: 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  es from.  ** the
ef50: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
ef60: 75 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a  uses of a left j
ef70: 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73  oin disqualifies
ef80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
ef90: 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20    ** from being 
efa0: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74  considered const
efb0: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57  ant. */.  if( pW
efc0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20  alker->eCode==2 
efd0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
efe0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
eff0: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57  mJoin) ){.    pW
f000: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
f010: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
f020: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73  _Abort;.  }..  s
f030: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
f040: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
f050: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
f060: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
f070: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
f080: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
f090: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68  .    ** and eith
f0a0: 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  er pWalker->eCod
f0b0: 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65  e==4 or 5 or the
f0c0: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68   function has th
f0d0: 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  e.    ** SQLITE_
f0e0: 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e  FUNC_CONST flag.
f0f0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
f100: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
f110: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
f120: 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73  de>=4 || ExprHas
f130: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45  Property(pExpr,E
f140: 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a  P_ConstFunc) ){.
f150: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
f160: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
f170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f180: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
f190: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
f1a0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
f1b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65        }.    case
f1c0: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 20 20 2f 2a   TK_ID:.      /*
f1d0: 20 43 6f 6e 76 65 72 74 20 22 74 72 75 65 22 20   Convert "true" 
f1e0: 6f 72 20 22 66 61 6c 73 65 22 20 69 6e 20 61 20  or "false" in a 
f1f0: 44 45 46 41 55 4c 54 20 63 6c 61 75 73 65 20 69  DEFAULT clause i
f200: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  nto the.      **
f210: 20 61 70 70 72 6f 70 72 69 61 74 65 20 54 4b 5f   appropriate TK_
f220: 54 52 55 45 46 41 4c 53 45 20 6f 70 65 72 61 74  TRUEFALSE operat
f230: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  or */.      if( 
f240: 73 71 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54  sqlite3ExprIdToT
f250: 72 75 65 46 61 6c 73 65 28 70 45 78 70 72 29 20  rueFalse(pExpr) 
f260: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f270: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
f280: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
f290: 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
f2a0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
f2b0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
f2c0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
f2d0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
f2e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f2f0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
f300: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
f310: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
f320: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
f330: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
f340: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
f350: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
f360: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
f370: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
f380: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  UMN );.      if(
f390: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f3a0: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
f3b0: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
f3c0: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
f3d0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
f3e0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
f3f0: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
f400: 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
f410: 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a 20  K_IF_NULL_ROW:. 
f420: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
f430: 54 45 52 3a 0a 20 20 20 20 20 20 74 65 73 74 63  TER:.      testc
f440: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
f450: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
f460: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f470: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f  Expr->op==TK_IF_
f480: 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20 20  NULL_ROW );.    
f490: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
f4a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
f4b0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
f4c0: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
f4d0: 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  LE:.      if( pW
f4e0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20  alker->eCode==5 
f4f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ){.        /* Si
f500: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62  lently convert b
f510: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20  ound parameters 
f520: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73 69  that appear insi
f530: 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20  de of CREATE.   
f540: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
f550: 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77  ts into a NULL w
f560: 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20  hen parsing the 
f570: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
f580: 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20   text out.      
f590: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69    ** of the sqli
f5a0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
f5b0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
f5c0: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
f5d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f5e0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
f5f0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
f600: 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  A bound paramete
f610: 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73 74  r in a CREATE st
f620: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69  atement that ori
f630: 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20  ginates from.   
f640: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
f650: 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65 73  prepare() causes
f660: 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
f670: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f680: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
f690: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
f6a0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
f6b0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
f6c0: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
f6d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f6e0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
f6f0: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71 6c 69  ELECT ); /* sqli
f700: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
f710: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
f720: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f730: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
f740: 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69  XISTS ); /* sqli
f750: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
f760: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
f770: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
f780: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
f790: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
f7a0: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
f7b0: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
f7c0: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
f7d0: 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65  ker w;.  w.eCode
f7e0: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
f7f0: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
f800: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
f810: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
f820: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
f830: 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
f840: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f850: 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63  DEBUG.  w.xSelec
f860: 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c  tCallback2 = sql
f870: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73  ite3SelectWalkAs
f880: 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20  sert2;.#endif.  
f890: 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  w.u.iCur = iCur;
f8a0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
f8b0: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
f8c0: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
f8d0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
f8e0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
f8f0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
f900: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
f910: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
f920: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
f930: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
f940: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
f950: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
f960: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
f970: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
f980: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
f990: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
f9a0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
f9b0: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
f9c0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
f9d0: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
f9e0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
f9f0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
fa00: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
fa10: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
fa20: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
fa30: 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  p, 1, 0);.}../*.
fa40: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
fa50: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
fa60: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
fa70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
fa80: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
fa90: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
faa0: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
fab0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
fac0: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
fad0: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
fae0: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
faf0: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
fb00: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
fb10: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
fb20: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
fb30: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
fb40: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
fb50: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
fb60: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
fb70: 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 2, 0);.}../*.*
fb80: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
fb90: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
fba0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
fbb0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
fbc0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
fbd0: 20 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20   any single row 
fbe0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  of the table wit
fbf0: 68 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20  h cursor iCur.  
fc00: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
fc10: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
fc20: 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72  n must not refer
fc30: 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65   to any non-dete
fc40: 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69  rministic functi
fc50: 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61  on nor any.** ta
fc60: 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69  ble other than i
fc70: 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Cur..*/.int sqli
fc80: 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
fc90: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20  nstant(Expr *p, 
fca0: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74  int iCur){.  ret
fcb0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
fcc0: 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a  p, 3, iCur);.}..
fcd0: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61  ./*.** sqlite3Wa
fce0: 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63  lkExpr() callbac
fcf0: 6b 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  k used by sqlite
fd00: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
fd10: 72 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73  rGroupBy()..*/.s
fd20: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
fd30: 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  deIsConstantOrGr
fd40: 6f 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57  oupBy(Walker *pW
fd50: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
fd60: 70 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  pr){.  ExprList 
fd70: 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c  *pGroupBy = pWal
fd80: 6b 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b  ker->u.pGroupBy;
fd90: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
fda0: 43 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69  Check if pExpr i
fdb0: 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61  s identical to a
fdc0: 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  ny GROUP BY term
fdd0: 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65  . If so, conside
fde0: 72 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61  r.  ** it consta
fdf0: 6e 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  nt.  */.  for(i=
fe00: 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
fe10: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
fe20: 45 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70  Expr *p = pGroup
fe30: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
fe40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
fe50: 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45  xprCompare(0, pE
fe60: 78 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b  xpr, p, -1)<2 ){
fe70: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
fe80: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
fe90: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61  xprNNCollSeq(pWa
fea0: 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29  lker->pParse, p)
feb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
fec0: 74 65 33 5f 73 74 72 69 63 6d 70 28 22 42 49 4e  te3_stricmp("BIN
fed0: 41 52 59 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  ARY", pColl->zNa
fee0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
fef0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
ff00: 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
ff10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
ff20: 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  k if pExpr is a 
ff30: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66 20 73  sub-select. If s
ff40: 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74 20 76  o, consider it v
ff50: 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66  ariable. */.  if
ff60: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ff70: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
ff80: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 57  elect) ){.    pW
ff90: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
ffa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
ffb0: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72  _Abort;.  }..  r
ffc0: 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65 49 73  eturn exprNodeIs
ffd0: 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b 65 72  Constant(pWalker
ffe0: 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
fff0: 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72  ** Walk the expr
10000 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61 73 73  ession tree pass
10010 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
10020 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e  argument. Return
10030 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66 20   non-zero.** if 
10040 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
10050 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
10060 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 6f 72   of constants or
10070 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72 6d 73   copies of terms
10080 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70 42 79   .** in pGroupBy
10090 20 74 68 61 74 20 73 6f 72 74 20 77 69 74 68 20   that sort with 
100a0 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  the BINARY colla
100b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a  tion sequence..*
100c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
100d0 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
100e0 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65 72 6d  ermine if a term
100f0 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63   of the HAVING c
10100 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62 65 20  lause can.** be 
10110 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20 74 68  promoted into th
10120 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
10130 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 73 75   In order for su
10140 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e 20 74  ch a promotion t
10150 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20 76  o work,.** the v
10160 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41 56 49  alue of the HAVI
10170 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6d  NG clause term m
10180 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
10190 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  for all members 
101a0 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70 22 2e  of.** a "group".
101b0 20 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e    The requiremen
101c0 74 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50  t that the GROUP
101d0 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20 62 65   BY term must be
101e0 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73 75 6d   BINARY.** assum
101f0 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
10200 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10210 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20 61 20  nce will have a 
10220 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a 2a 2a  finer-grained.**
10230 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e 20 62   grouping than b
10240 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  inary.  In other
10250 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f 4c 4c   words (A=B COLL
10260 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d 70 6c  ATE binary) impl
10270 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20 65 76  ies.** A=B in ev
10280 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74  ery other collat
10290 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ing sequence.  T
102a0 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74  he requirement t
102b0 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50  hat the.** GROUP
102c0 20 42 59 20 62 65 20 42 49 4e 41 52 59 20 69 73   BY be BINARY is
102d0 20 73 74 72 69 63 74 65 72 20 74 68 61 6e 20 6e   stricter than n
102e0 65 63 65 73 73 61 72 79 2e 20 20 49 74 20 77 6f  ecessary.  It wo
102f0 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a 2a  uld also work.**
10300 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41 56 49   to promote HAVI
10310 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61 74 20  NG clauses that 
10320 75 73 65 20 74 68 65 20 73 61 6d 65 20 61 6c 74  use the same alt
10330 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
10340 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61  ng.** sequence a
10350 73 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  s the GROUP BY t
10360 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20 69 73  erm, but that is
10370 20 6d 75 63 68 20 68 61 72 64 65 72 20 74 6f 20   much harder to 
10380 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72 6e  check,.** altern
10390 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
103a0 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 75 6e  sequences are un
103b0 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73  common, and this
103c0 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20 6f   is only an.** o
103d0 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f 20  ptimization, so 
103e0 77 65 20 74 61 6b 65 20 74 68 65 20 65 61 73 79  we take the easy
103f0 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73 69 6d   way out and sim
10400 70 6c 79 20 72 65 71 75 69 72 65 20 74 68 65 0a  ply require the.
10410 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f 20 75  ** GROUP BY to u
10420 73 65 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f  se the BINARY co
10430 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10440 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10450 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
10460 47 72 6f 75 70 42 79 28 50 61 72 73 65 20 2a 70  GroupBy(Parse *p
10470 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
10480 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
10490 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  By){.  Walker w;
104a0 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a  .  w.eCode = 1;.
104b0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
104c0 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
104d0 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 3b  nstantOrGroupBy;
104e0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
104f0 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  back = 0;.  w.u.
10500 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
10510 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  pBy;.  w.pParse 
10520 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
10530 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
10540 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
10550 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
10560 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
10570 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
10580 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
10590 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
105a0 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
105b0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
105c0 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
105d0 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
105e0 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
105f0 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
10600 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
10610 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
10620 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
10630 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
10640 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
10650 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
10660 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
10670 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
10680 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
10690 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
106a0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
106b0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
106c0 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
106d0 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a  *p, u8 isInit){.
106e0 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74    assert( isInit
106f0 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31  ==0 || isInit==1
10700 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70   );.  return exp
10710 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73  rIsConst(p, 4+is
10720 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Init, 0);.}..#if
10730 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10740 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f  E_CURSOR_HINTS./
10750 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
10760 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
10770 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
10780 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
10790 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79  ns a.** subquery
107a0 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
107b0 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
107c0 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72  e are no subquer
107d0 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ies..*/.int sqli
107e0 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53  te3ExprContainsS
107f0 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29  ubquery(Expr *p)
10800 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
10810 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77  w.eCode = 1;.  w
10820 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
10830 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
10840 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Noop;.  w.xSelec
10850 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
10860 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
10870 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  l;.#ifdef SQLITE
10880 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65  _DEBUG.  w.xSele
10890 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71  ctCallback2 = sq
108a0 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41  lite3SelectWalkA
108b0 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20  ssert2;.#endif. 
108c0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
108d0 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
108e0 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a  n w.eCode==0;.}.
108f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
10900 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10910 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61  p codes a consta
10920 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  nt integer that 
10930 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a  is small enough.
10940 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33  ** to fit in a 3
10950 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
10960 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20  eturn 1 and put 
10970 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
10980 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a   integer.** in *
10990 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20  pValue.  If the 
109a0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
109b0 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  t an integer or 
109c0 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67  if it is too big
109d0 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
109e0 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
109f0 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20  teger, return 0 
10a00 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75  and leave *pValu
10a10 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
10a20 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10a30 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70  sInteger(Expr *p
10a40 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
10a50 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
10a60 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
10a70 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c  n 0;  /* Can onl
10a80 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f 77 69  y happen followi
10a90 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20 20  ng on OOM */..  
10aa0 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73  /* If an express
10ab0 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ion is an intege
10ac0 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66  r literal that f
10ad0 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20  its in a signed 
10ae0 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65  32-bit.  ** inte
10af0 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50  ger, then the EP
10b00 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77  _IntValue flag w
10b10 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
10b20 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61   been set */.  a
10b30 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
10b40 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e  _INTEGER || (p->
10b50 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
10b60 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20  lue)!=0.        
10b70 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74     || sqlite3Get
10b80 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65  Int32(p->u.zToke
10b90 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20  n, &rc)==0 );.. 
10ba0 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
10bb0 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
10bc0 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e     *pValue = p->
10bd0 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65  u.iValue;.    re
10be0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77  turn 1;.  }.  sw
10bf0 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
10c00 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
10c10 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  : {.      rc = s
10c20 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
10c30 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56  ger(p->pLeft, pV
10c40 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alue);.      bre
10c50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10c60 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
10c70 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20        int v;.   
10c80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
10c90 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
10ca0 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20  Left, &v) ){.   
10cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d       assert( v!=
10cc0 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20  (-2147483647-1) 
10cd0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  );.        *pVal
10ce0 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20  ue = -v;.       
10cf0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
10d00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10d10 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
10d20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
10d30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10d40 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
10d50 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
10d60 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78  ance that the ex
10d70 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
10d80 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  NULL..**.** If t
10d90 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
10da0 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69  ght be NULL or i
10db0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10dc0 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a   is too complex.
10dd0 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72  ** to tell retur
10de0 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20  n TRUE.  .**.** 
10df0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10e00 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d  used as an optim
10e10 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70  ization, to skip
10e20 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64   OP_IsNull opcod
10e30 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e  es.** when we kn
10e40 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20  ow that a value 
10e50 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20  cannot be NULL. 
10e60 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20   Hence, a false 
10e70 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74  positive.** (ret
10e80 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e  urning TRUE when
10e90 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70   in fact the exp
10ea0 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65  ression can neve
10eb0 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74  r be NULL) might
10ec0 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70  .** be a small p
10ed0 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62  erformance hit b
10ee0 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
10ef0 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68  harmless.  On th
10f00 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c  e other.** hand,
10f10 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   a false negativ
10f20 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c  e (returning FAL
10f30 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  SE when the resu
10f40 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c  lt could be NULL
10f50 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ).** will likely
10f60 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
10f70 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20  correct answer. 
10f80 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62   So when in doub
10f90 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55  t, return.** TRU
10fa0 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
10fb0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63  3ExprCanBeNull(c
10fc0 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20  onst Expr *p){. 
10fd0 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28   u8 op;.  while(
10fe0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
10ff0 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
11000 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
11010 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
11020 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
11030 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
11040 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
11050 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
11060 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
11070 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
11080 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NG:.    case TK_
11090 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
110a0 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  TK_BLOB:.      r
110b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73  eturn 0;.    cas
110c0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
110d0 20 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61     return ExprHa
110e0 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
110f0 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20  CanBeNull) ||.  
11100 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 54             p->pT
11110 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66  ab==0 ||  /* Ref
11120 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e  erence to column
11130 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20 65 78 70   of index on exp
11140 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
11150 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c          (p->iCol
11160 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61  umn>=0 && p->pTa
11170 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75  b->aCol[p->iColu
11180 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b  mn].notNull==0);
11190 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
111a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
111b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
111c0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
111d0 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
111e0 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69  s a constant whi
111f0 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75  ch would be.** u
11200 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41  nchanged by OP_A
11210 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65  ffinity with the
11220 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20   affinity given 
11230 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  in the second.**
11240 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
11250 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11260 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
11270 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66  ne if the OP_Aff
11280 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a  inity operation.
11290 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
112a0 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  d.  When in doub
112b0 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20  t return FALSE. 
112c0 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   A false negativ
112d0 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73  e.** is harmless
112e0 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
112f0 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61  ive, however, ca
11300 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  n result in the 
11310 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e  wrong.** answer.
11320 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
11330 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
11340 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45  tyChange(const E
11350 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66  xpr *p, char aff
11360 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66  ){.  u8 op;.  if
11370 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ( aff==SQLITE_AF
11380 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20  F_BLOB ) return 
11390 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  1;.  while( p->o
113a0 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
113b0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
113c0 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
113d0 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
113e0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
113f0 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
11400 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
11410 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
11420 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
11430 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
11440 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
11450 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
11460 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
11470 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11480 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
11490 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
114a0 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66  E_AFF_REAL || af
114b0 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
114c0 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
114d0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
114e0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
114f0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11500 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
11510 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
11520 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
11530 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11540 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
11550 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
11560 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20  ble>=0 );  /* p 
11570 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f  cannot be part o
11580 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  f a CHECK constr
11590 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  aint */.      re
115a0 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c  turn p->iColumn<
115b0 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
115c0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
115d0 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
115e0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
115f0 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  IC);.    }.    d
11600 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
11610 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
11620 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
11630 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
11640 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
11650 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
11660 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
11670 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
11680 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
11690 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
116a0 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
116b0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
116c0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
116d0 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
116e0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
116f0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
11700 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
11710 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
11720 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
11730 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f   pX is the RHS o
11740 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
11750 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45  .  If pX is a SE
11760 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a  LECT statement .
11770 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ** that can be s
11780 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64  implified to a d
11790 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65  irect table acce
117a0 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ss, then return.
117b0 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
117c0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
117d0 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20  ment.  If pX is 
117e0 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61  not a SELECT sta
117f0 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66  tement,.** or if
11800 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
11810 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62  ement needs to b
11820 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74  e manifested int
11830 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a  o a transient.**
11840 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74   table, then ret
11850 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66  urn NULL..*/.#if
11860 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11870 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63  _SUBQUERY.static
11880 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69   Select *isCandi
11890 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70  dateForInOpt(Exp
118a0 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74  r *pX){.  Select
118b0 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *p;.  SrcList *
118c0 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74  pSrc;.  ExprList
118d0 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c   *pEList;.  Tabl
118e0 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
118f0 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
11900 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
11910 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74  xIsSelect) ) ret
11920 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61  urn 0;  /* Not a
11930 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
11940 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
11950 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c  ty(pX, EP_VarSel
11960 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30  ect)  ) return 0
11970 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64  ;  /* Correlated
11980 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70   subq */.  p = p
11990 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  X->x.pSelect;.  
119a0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
119b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
119c0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20         /* Not a 
119d0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
119e0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
119f0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
11a00 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
11a10 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  ) ){.    testcas
11a20 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
11a30 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
11a40 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
11a50 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
11a60 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
11a70 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
11a80 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
11a90 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
11aa0 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75  gate );.    retu
11ab0 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54  rn 0; /* No DIST
11ac0 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64  INCT keyword and
11ad0 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
11ae0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20  nctions */.  }. 
11af0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
11b00 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20  upBy==0 );      
11b10 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
11b20 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
11b30 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c  e */.  if( p->pL
11b40 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b60 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c   Has no LIMIT cl
11b70 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
11b80 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
11b90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11ba0 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45   /* Has no WHERE
11bb0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72   clause */.  pSr
11bc0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
11bd0 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
11be0 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53  ;.  if( pSrc->nS
11bf0 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
11c00 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
11c10 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f  ngle term in FRO
11c20 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  M clause */.  if
11c30 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ( pSrc->a[0].pSe
11c40 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
11c50 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20       /* FROM is 
11c60 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f  not a subquery o
11c70 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62  r view */.  pTab
11c80 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54   = pSrc->a[0].pT
11c90 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ab;.  assert( pT
11ca0 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
11cb0 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  t( pTab->pSelect
11cc0 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
11cd0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
11ce0 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a   is not a view *
11cf0 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
11d00 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
11d10 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52   0;        /* FR
11d20 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20  OM clause not a 
11d30 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
11d40 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
11d50 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28  EList;.  assert(
11d60 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
11d70 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65  /* All SELECT re
11d80 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f  sults must be co
11d90 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28  lumns. */.  for(
11da0 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
11db0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
11dc0 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c  Expr *pRes = pEL
11dd0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
11de0 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f  .    if( pRes->o
11df0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
11e00 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73  eturn 0;.    ass
11e10 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c  ert( pRes->iTabl
11e20 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43  e==pSrc->a[0].iC
11e30 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74  ursor );  /* Not
11e40 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
11e50 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20  bquery */.  }.  
11e60 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64  return p;.}.#end
11e70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11e80 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
11e90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11ea0 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
11eb0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
11ec0 74 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20  that checks the 
11ed0 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
11ee0 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20   of index table 
11ef0 69 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a  iCur to see if.*
11f00 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  * it contains an
11f10 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20  y NULL entries. 
11f20 20 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73   Cause the regis
11f30 74 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c  ter at regHasNul
11f40 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74  l to be set.** t
11f50 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  o a non-NULL val
11f60 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  ue if iCur conta
11f70 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43  ins no NULLs.  C
11f80 61 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65  ause register re
11f90 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62  gHasNull.** to b
11fa0 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  e set to NULL if
11fb0 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f   iCur contains o
11fc0 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
11fd0 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  values..*/.stati
11fe0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
11ff0 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62  tHasNullFlag(Vdb
12000 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20  e *v, int iCur, 
12010 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b  int regHasNull){
12020 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20  .  int addr1;.  
12030 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12040 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
12050 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b   0, regHasNull);
12060 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
12070 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12080 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29  OP_Rewind, iCur)
12090 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
120a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
120b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
120c0 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65  umn, iCur, 0, re
120d0 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c  gHasNull);.  sql
120e0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
120f0 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
12100 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d  FARG);.  VdbeCom
12110 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f  ment((v, "first_
12120 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69  entry_in(%d)", i
12130 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cur));.  sqlite3
12140 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12150 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66  addr1);.}.#endif
12160 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
12170 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
12180 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
12190 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  nt is an IN oper
121a0 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74  ator with a list
121b0 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79   (not a subquery
121c0 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67  ) on the .** rig
121d0 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52  ht-hand side.  R
121e0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
121f0 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74  at list is const
12200 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ant..*/.static i
12210 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49  nt sqlite3InRhsI
12220 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
12230 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c  pIn){.  Expr *pL
12240 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  HS;.  int res;. 
12250 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
12260 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45  sProperty(pIn, E
12270 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
12280 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c    pLHS = pIn->pL
12290 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66  eft;.  pIn->pLef
122a0 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73  t = 0;.  res = s
122b0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
122c0 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e  tant(pIn);.  pIn
122d0 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a  ->pLeft = pLHS;.
122e0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
122f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
12300 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
12310 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
12320 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
12330 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
12340 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61  or..** The pX pa
12350 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
12360 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65  xpression on the
12370 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
12380 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a  perator, which.*
12390 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65  * might be eithe
123a0 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  r a list of expr
123b0 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62  essions or a sub
123c0 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
123d0 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
123e0 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20  tine is to find 
123f0 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72  or create a b-tr
12400 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63  ee object that c
12410 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69  an.** be used ei
12420 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72  ther to test for
12430 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74   membership in t
12440 68 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f  he RHS set or to
12450 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
12460 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  .** all members 
12470 6f 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20  of the RHS set, 
12480 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61  skipping duplica
12490 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72  tes..**.** A cur
124a0 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  sor is opened on
124b0 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
124c0 63 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52  ct that is the R
124d0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
124e0 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d  rator.** and pX-
124f0 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  >iTable is set t
12500 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
12510 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  hat cursor..**.*
12520 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
12530 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
12540 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20  ction indicates 
12550 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c  the b-tree type,
12560 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
12570 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
12580 57 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63  WID      - The c
12590 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
125a0 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
125b0 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
125c0 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d  DEX_INDEX_ASC  -
125d0 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
125e0 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63  opened on an asc
125f0 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a  ending index..**
12600 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
12610 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72  X_DESC - The cur
12620 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
12630 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
12640 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
12650 44 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d  DEX_EPH        -
12660 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
12670 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63  opened on a spec
12680 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e  ially created an
12690 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70               pop
126b0 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c  ulated epheremal
126c0 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
126d0 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20  INDEX_NOOP      
126e0 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73   - No cursor was
126f0 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65   allocated.  The
12700 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73   IN operator mus
12710 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
12740 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d   sequence of com
12750 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  parisons..**.** 
12760 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72  An existing b-tr
12770 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  ee might be used
12780 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72   if the RHS expr
12790 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73  ession pX is a s
127a0 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72  imple.** subquer
127b0 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a  y such as:.**.**
127c0 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
127d0 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e  umn1>, <column2>
127e0 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e  ... FROM <table>
127f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48  .**.** If the RH
12800 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
12810 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f  ator is a list o
12820 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  r a more complex
12830 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a   subquery, then.
12840 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ** an ephemeral 
12850 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64  table might need
12860 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
12870 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e   from the RHS an
12880 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54  d then.** pX->iT
12890 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69  able made to poi
128a0 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65  nt to the epheme
128b0 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61  ral table instea
128c0 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74  d of an.** exist
128d0 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ing table..**.**
128e0 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72   The inFlags par
128f0 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74  ameter must cont
12900 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69 6d 75  ain, at a minimu
12910 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69  m, one of the bi
12920 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ts.** IN_INDEX_M
12930 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f  EMBERSHIP or IN_
12940 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74 20 6e  INDEX_LOOP but n
12950 6f 74 20 62 6f 74 68 2e 20 20 49 66 20 69 6e 46  ot both.  If inF
12960 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  lags contains.**
12970 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
12980 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67  SHIP, then the g
12990 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20 77  enerated table w
129a0 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
129b0 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62 65 72  a fast.** member
129c0 73 68 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e  ship test.  When
129d0 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f   the IN_INDEX_LO
129e0 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c 20 74  OP bit is set, t
129f0 68 65 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c  he IN index will
12a00 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 6c  .** be used to l
12a10 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  oop over all val
12a20 75 65 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f  ues of the RHS o
12a30 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
12a40 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e  r..**.** When IN
12a50 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75  _INDEX_LOOP is u
12a60 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74  sed (and the b-t
12a70 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
12a80 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74   to iterate.** t
12a90 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d  hrough the set m
12aa0 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65  embers) then the
12ab0 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74   b-tree must not
12ac0 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61   contain duplica
12ad0 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72  tes..** An epher
12ae0 65 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  emal table will 
12af0 62 65 20 63 72 65 61 74 65 64 20 75 6e 6c 65 73  be created unles
12b00 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63  s the selected c
12b10 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72 61  olumns are guara
12b20 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75  nteed.** to be u
12b30 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62  nique - either b
12b40 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20  ecause it is an 
12b50 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
12b60 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a  KEY or due to.**
12b70 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72   a UNIQUE constr
12b80 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a  aint or index..*
12b90 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44  *.** When IN_IND
12ba0 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73  EX_MEMBERSHIP is
12bb0 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62   used (and the b
12bc0 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
12bd0 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20  ed .** for fast 
12be0 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
12bf0 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70  ests) then an ep
12c00 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
12c10 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75  st .** be used u
12c20 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20  nless <columns> 
12c30 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54 45  is a single INTE
12c40 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
12c50 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a  column or an .**
12c60 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66 6f   index can be fo
12c70 75 6e 64 20 77 69 74 68 20 74 68 65 20 73 70 65  und with the spe
12c80 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e  cified <columns>
12c90 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73   as its left-mos
12ca0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
12cb0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
12cc0 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45   and IN_INDEX_ME
12cd0 4d 42 45 52 53 48 49 50 20 61 72 65 20 62 6f 74  MBERSHIP are bot
12ce0 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20  h set and.** if 
12cf0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12d00 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
12d10 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71  list (not a subq
12d20 75 65 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a  uery) then this.
12d30 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  ** routine might
12d40 20 64 65 63 69 64 65 20 74 68 61 74 20 63 72 65   decide that cre
12d50 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ating an ephemer
12d60 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65  al b-tree for me
12d70 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74  mbership.** test
12d80 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e  ing is too expen
12d90 73 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20  sive and return 
12da0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20  IN_INDEX_NOOP.  
12db0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
12dc0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
12dd0 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c  tine should impl
12de0 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65  ement the IN ope
12df0 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65  rator using a se
12e00 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20  quence.** of Eq 
12e10 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e  or Ne comparison
12e20 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   operations..**.
12e30 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72  ** When the b-tr
12e40 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ee is being used
12e50 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
12e60 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69  tests, the calli
12e70 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  ng function.** m
12e80 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ight need to kno
12e90 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  w whether or not
12ea0 20 74 68 65 20 52 48 53 20 73 69 64 65 20 6f 66   the RHS side of
12eb0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
12ec0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e  .** contains a N
12ed0 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61  ULL.  If prRhsHa
12ee0 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e  sNull is not a N
12ef0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  ULL pointer and 
12f00 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
12f10 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20  any chance that 
12f20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20  the (...) might 
12f30 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76  contain a NULL v
12f40 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69  alue at.** runti
12f50 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73  me, then a regis
12f60 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
12f70 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65   and the registe
12f80 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e  r number written
12f90 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73  .** to *prRhsHas
12fa0 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69  Null. If there i
12fb0 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
12fc0 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61   the (...) conta
12fd0 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61  ins a.** NULL va
12fe0 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73  lue, then *prRhs
12ff0 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20  HasNull is left 
13000 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
13010 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
13020 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
13030 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f  its location sto
13040 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73  red in *prRhsHas
13050 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  Null, then.** th
13060 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20  e value in that 
13070 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65  register will be
13080 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74   NULL if the b-t
13090 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ree contains one
130a0 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c   or more.** NULL
130b0 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20   values, and it 
130c0 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e  will be some non
130d0 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74  -NULL value if t
130e0 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69  he b-tree contai
130f0 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61  ns no.** NULL va
13100 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lues..**.** If t
13110 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65 74  he aiMap paramet
13120 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  er is not NULL, 
13130 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  it must point to
13140 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61 69   an array contai
13150 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d  ning.** one elem
13160 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ent for each col
13170 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  umn returned by 
13180 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
13190 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53 0a  ment on the RHS.
131a0 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e  ** of the IN(...
131b0 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20  ) operator. The 
131c0 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  i'th entry of th
131d0 65 20 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c  e array is popul
131e0 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a  ated with the.**
131f0 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 69   offset of the i
13200 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ndex column that
13210 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 27 74   matches the i't
13220 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
13230 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45  d by the.** SELE
13240 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  CT. For example,
13250 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
13260 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64 20  on and selected 
13270 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  index are:.**.**
13280 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53     (?,?,?) IN (S
13290 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52  ELECT a, b, c FR
132a0 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45 41  OM t1).**   CREA
132b0 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
132c0 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a  1(b, c, a);.**.*
132d0 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69  * then aiMap[] i
132e0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
132f0 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23   {2, 0, 1}..*/.#
13300 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13310 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
13320 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
13330 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
13340 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
13350 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
13360 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
13370 58 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X,              
13380 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
13390 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
133a0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
133b0 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46  tor */.  u32 inF
133c0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
133d0 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f      /* IN_INDEX_
133e0 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49  LOOP, _MEMBERSHI
133f0 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f  P, and/or _NOOP_
13400 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52  OK */.  int *prR
13410 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20  hsHasNull,      
13420 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
13430 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74  olding NULL stat
13440 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73 20 2a  us.  See notes *
13450 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 20  /.  int *aiMap  
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13470 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 49  * Mapping from I
13480 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f 20 52  ndex fields to R
13490 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a  HS fields */.){.
134a0 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20    Select *p;    
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134c0 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
134d0 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  T to the right o
134e0 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
134f0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30  .  int eType = 0
13500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13510 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
13520 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49   of RHS table. I
13530 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69  N_INDEX_* */.  i
13540 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
13550 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20  ->nTab++;       
13560 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
13570 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20  f the RHS table 
13580 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55  */.  int mustBeU
13590 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20 20  nique;          
135a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
135b0 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62  ue if RHS must b
135c0 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64  e unique */.  Vd
135d0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
135e0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20  etVdbe(pParse); 
135f0 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
13600 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
13610 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
13620 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
13630 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65  ;.  mustBeUnique
13640 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e   = (inFlags & IN
13650 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b  _INDEX_LOOP)!=0;
13660 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48  ..  /* If the RH
13670 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e  S of this IN(...
13680 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  ) operator is a 
13690 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66 20 69  SELECT, and if i
136a0 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a 20  t matters .  ** 
136b0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
136c0 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  he SELECT result
136d0 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76   contains NULL v
136e0 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77 68 65  alues, check whe
136f0 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74  ther.  ** or not
13700 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c   NULL is actuall
13710 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74 20 6d  y possible (it m
13720 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65  ay not be, for e
13730 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a  xample, due .  *
13740 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  * to NOT NULL co
13750 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65  nstraints in the
13760 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20   schema). If no 
13770 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
13780 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73  possible,.  ** s
13790 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  et prRhsHasNull 
137a0 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f 6e 74  to 0 before cont
137b0 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66  inuing.  */.  if
137c0 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26  ( prRhsHasNull &
137d0 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45  & (pX->flags & E
137e0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
137f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45      int i;.    E
13800 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
13810 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  = pX->x.pSelect-
13820 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72  >pEList;.    for
13830 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
13840 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13850 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
13860 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69  prCanBeNull(pELi
13870 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
13880 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
13890 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69 73 74     if( i==pEList
138a0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
138b0 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20   prRhsHasNull = 
138c0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
138d0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
138e0 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  if an existing t
138f0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61  able or index ca
13900 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a  n be used to.  *
13910 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75  * satisfy the qu
13920 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72  ery.  This is pr
13930 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65  eferable to gene
13940 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20  rating a new .  
13950 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  ** ephemeral tab
13960 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  le.  */.  if( pP
13970 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26  arse->nErr==0 &&
13980 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64 61 74   (p = isCandidat
13990 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29 21 3d  eForInOpt(pX))!=
139a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
139b0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
139c0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
139d0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
139e0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61  ection */.    Ta
139f0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a10 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74       /* Table <t
13a20 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31  able>. */.    i1
13a30 36 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  6 iDb;          
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a50 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
13a60 20 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f   idx for pTab */
13a70 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
13a80 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
13a90 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  t;.    int nExpr
13aa0 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
13ab0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
13ac0 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20  ->pEList!=0 );  
13ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
13ae0 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
13af0 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
13b00 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
13b10 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
13b20 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65  Expr!=0 ); /* Be
13b30 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
13b40 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
13b50 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
13b60 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20  ->pSrc!=0 );    
13b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
13b80 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
13b90 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
13ba0 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d  */.    pTab = p-
13bb0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
13bc0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61  ;..    /* Code a
13bd0 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  n OP_Transaction
13be0 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63   and OP_TableLoc
13bf0 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a  k for <table>. *
13c00 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
13c10 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
13c20 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
13c30 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
13c40 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
13c50 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
13c60 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
13c70 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
13c80 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
13c90 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
13ca0 20 20 20 61 73 73 65 72 74 28 76 29 3b 20 20 2f     assert(v);  /
13cb0 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
13cc0 28 29 20 68 61 73 20 61 6c 77 61 79 73 20 62 65  () has always be
13cd0 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61  en previously ca
13ce0 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  lled */.    if( 
13cf0 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69  nExpr==1 && pELi
13d00 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
13d10 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
13d20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49 4e 20     /* The "x IN 
13d30 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52  (SELECT rowid FR
13d40 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73 65 20  OM table)" case 
13d50 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64  */.      int iAd
13d60 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13d70 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
13d80 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
13d90 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
13da0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
13db0 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
13dc0 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
13dd0 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
13de0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
13df0 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73  _ROWID;..      s
13e00 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13e10 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
13e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
13e30 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e50 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
13e60 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
13e70 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f    int affinity_o
13e80 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  k = 1;.      int
13e90 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68   i;..      /* Ch
13ea0 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66  eck that the aff
13eb0 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20  inity that will 
13ec0 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f  be used to perfo
13ed0 72 6d 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a  rm each .      *
13ee0 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
13ef0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
13f00 61 66 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68  affinity of each
13f10 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
13f20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
13f30 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
13f40 70 65 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20  perator.  If it 
13f50 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  not, it is not p
13f60 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20 20 20 20  ossible to.     
13f70 20 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e 64 65   ** use any inde
13f80 78 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  x of the RHS tab
13f90 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  le.  */.      fo
13fa0 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26  r(i=0; i<nExpr &
13fb0 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69  & affinity_ok; i
13fc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
13fd0 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65  r *pLhs = sqlite
13fe0 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
13ff0 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69  xpr(pX->pLeft, i
14000 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
14010 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Col = pEList->a[
14020 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  i].pExpr->iColum
14030 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  n;.        char 
14040 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33  idxaff = sqlite3
14050 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e  TableColumnAffin
14060 69 74 79 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20  ity(pTab,iCol); 
14070 2f 2a 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a  /* RHS table */.
14080 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6d 70          char cmp
14090 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
140a0 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68  pareAffinity(pLh
140b0 73 2c 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20  s, idxaff);.    
140c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d      testcase( cm
140d0 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  paff==SQLITE_AFF
140e0 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20  _BLOB );.       
140f0 20 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66   testcase( cmpaf
14100 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f==SQLITE_AFF_TE
14110 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77  XT );.        sw
14120 69 74 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a  itch( cmpaff ){.
14130 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
14140 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a  QLITE_AFF_BLOB:.
14150 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
14160 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  k;.          cas
14170 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
14180 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  T:.            /
14190 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  * sqlite3Compare
141a0 41 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20  Affinity() only 
141b0 72 65 74 75 72 6e 73 20 54 45 58 54 20 69 66 20  returns TEXT if 
141c0 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a  one side or the.
141d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
141e0 74 68 65 72 20 68 61 73 20 6e 6f 20 61 66 66 69  ther has no affi
141f0 6e 69 74 79 20 61 6e 64 20 74 68 65 20 6f 74 68  nity and the oth
14200 65 72 20 73 69 64 65 20 69 73 20 54 45 58 54 2e  er side is TEXT.
14210 20 20 48 65 6e 63 65 2c 0a 20 20 20 20 20 20 20    Hence,.       
14220 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79       ** the only
14230 20 77 61 79 20 66 6f 72 20 63 6d 70 61 66 66 20   way for cmpaff 
14240 74 6f 20 62 65 20 54 45 58 54 20 69 73 20 66 6f  to be TEXT is fo
14250 72 20 69 64 78 61 66 66 20 74 6f 20 62 65 20 54  r idxaff to be T
14260 45 58 54 0a 20 20 20 20 20 20 20 20 20 20 20 20  EXT.            
14270 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74  ** and for the t
14280 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  erm on the LHS o
14290 66 20 74 68 65 20 49 4e 20 74 6f 20 68 61 76 65  f the IN to have
142a0 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f   no affinity. */
142b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
142c0 65 72 74 28 20 69 64 78 61 66 66 3d 3d 53 51 4c  ert( idxaff==SQL
142d0 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a  ITE_AFF_TEXT );.
142e0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
142f0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66  k;.          def
14300 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20  ault:.          
14310 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20    affinity_ok = 
14320 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
14330 41 66 66 69 6e 69 74 79 28 69 64 78 61 66 66 29  Affinity(idxaff)
14340 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14350 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 61    }..      if( a
14360 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20  ffinity_ok ){.  
14370 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
14380 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
14390 69 6e 64 65 78 20 74 68 61 74 20 77 69 6c 6c 20  index that will 
143a0 77 6f 72 6b 20 66 6f 72 20 74 68 69 73 20 49 4e  work for this IN
143b0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
143c0 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
143d0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
143e0 20 26 26 20 65 54 79 70 65 3d 3d 30 3b 20 70 49   && eType==0; pI
143f0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
14400 0a 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61  .          Bitma
14410 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20 20 20  sk colUsed;     
14420 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74   /* Columns of t
14430 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 2a 2f  he index used */
14440 0a 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61  .          Bitma
14450 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20  sk mCol;        
14460 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74 68 65   /* Mask for the
14470 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20   current column 
14480 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
14490 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e   pIdx->nColumn<n
144a0 45 78 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Expr ) continue;
144b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
144c0 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73  ximum nColumn is
144d0 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d   BMS-2, not BMS-
144e0 31 2c 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  1, so that we ca
144f0 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20 20 20 20  n compute.      
14500 20 20 20 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e      ** BITMASK(n
14510 45 78 70 72 29 20 77 69 74 68 6f 75 74 20 6f 76  Expr) without ov
14520 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20  erflowing */.   
14530 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14540 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
14550 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 20  BMS-2 );.       
14560 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64     testcase( pId
14570 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d  x->nColumn==BMS-
14580 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1 );.          i
14590 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
145a0 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e  >=BMS-1 ) contin
145b0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
145c0 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 29  ( mustBeUnique )
145d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
145e0 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e  ( pIdx->nKeyCol>
145f0 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20  nExpr.          
14600 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c     ||(pIdx->nCol
14610 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20 21 49 73  umn>nExpr && !Is
14620 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
14630 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  )).            )
14640 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
14650 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68  continue;  /* Th
14660 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  is index is not 
14670 75 6e 69 71 75 65 20 6f 76 65 72 20 74 68 65 20  unique over the 
14680 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a  IN RHS columns *
14690 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  /.            }.
146a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20            }.  . 
146b0 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64           colUsed
146c0 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d   = 0;   /* Colum
146d0 6e 73 20 6f 66 20 69 6e 64 65 78 20 75 73 65 64  ns of index used
146e0 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
146f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14700 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
14710 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
14720 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63  Lhs = sqlite3Vec
14730 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
14740 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pX->pLeft, i);. 
14750 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
14760 2a 70 52 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e  *pRhs = pEList->
14770 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
14780 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
14790 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42  *pReq = sqlite3B
147a0 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
147b0 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73  Seq(pParse, pLhs
147c0 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20  , pRhs);.       
147d0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20       int j;.  . 
147e0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
147f0 74 28 20 70 52 65 71 21 3d 30 20 7c 7c 20 70 52  t( pReq!=0 || pR
14800 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f  hs->iColumn==XN_
14810 52 4f 57 49 44 20 7c 7c 20 70 50 61 72 73 65 2d  ROWID || pParse-
14820 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20  >nErr );.       
14830 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
14840 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
14850 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
14860 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
14870 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20  !=pRhs->iColumn 
14880 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14890 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
148a0 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  ( pIdx->azColl[j
148b0 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ] );.           
148c0 20 20 20 69 66 28 20 70 52 65 71 21 3d 30 20 26     if( pReq!=0 &
148d0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
148e0 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49  (pReq->zName, pI
148f0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  dx->azColl[j])!=
14900 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
14910 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
14940 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
14950 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
14960 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62 72 65  ( j==nExpr ) bre
14970 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
14980 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a  mCol = MASKBIT(j
14990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
149a0 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65  f( mCol & colUse
149b0 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61  d ) break; /* Ea
149c0 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f  ch column used o
149d0 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20  nly once */.    
149e0 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20          colUsed 
149f0 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20  |= mCol;.       
14a00 20 20 20 20 20 69 66 28 20 61 69 4d 61 70 20 29       if( aiMap )
14a10 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20   aiMap[i] = j;. 
14a20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
14a30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14a40 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55  i==nExpr || colU
14a50 73 65 64 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45  sed!=(MASKBIT(nE
14a60 78 70 72 29 2d 31 29 20 29 3b 0a 20 20 20 20 20  xpr)-1) );.     
14a70 20 20 20 20 20 69 66 28 20 63 6f 6c 55 73 65 64       if( colUsed
14a80 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72  ==(MASKBIT(nExpr
14a90 29 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  )-1) ){.        
14aa0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
14ab0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  ch this point, t
14ac0 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 69 6e  hat means the in
14ad0 64 65 78 20 70 49 64 78 20 69 73 20 75 73 61 62  dex pIdx is usab
14ae0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
14af0 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
14b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
14b10 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
14b20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14b30 20 20 20 20 20 20 20 20 20 20 45 78 70 6c 61 69            Explai
14b40 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
14b50 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  se, 0,.         
14b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b70 20 20 20 20 20 22 55 53 49 4e 47 20 49 4e 44 45       "USING INDE
14b80 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52  X %s FOR IN-OPER
14b90 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d  ATOR",pIdx->zNam
14ba0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
14bb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14bc0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
14bd0 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74  d, iTab, pIdx->t
14be0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
14bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14c00 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
14c10 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
14c20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
14c30 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
14c40 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
14c50 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
14c60 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  t( IN_INDEX_INDE
14c70 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44  X_DESC == IN_IND
14c80 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29  EX_INDEX_ASC+1 )
14c90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 54  ;.            eT
14ca0 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
14cb0 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d  NDEX_ASC + pIdx-
14cc0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a  >aSortOrder[0];.
14cd0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69    .            i
14ce0 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
14cf0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
14d00 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
14d10 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20  SED_MASK.       
14d20 20 20 20 20 20 20 20 69 36 34 20 6d 61 73 6b 20         i64 mask 
14d30 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a  = (1<<nExpr)-1;.
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
14d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
14d60 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
14d70 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20  sUsed, .        
14d80 20 20 20 20 20 20 20 20 20 20 69 54 61 62 2c 20            iTab, 
14d90 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b  0, 0, (u8*)&mask
14da0 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e  , P4_INT64);.#en
14db0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
14dc0 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
14dd0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
14de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14df0 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a  if( nExpr==1 ){.
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e10 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
14e20 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a  lFlag(v, iTab, *
14e30 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20  prRhsHasNull);. 
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
14e50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
14e60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14e70 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14e80 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
14e90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a    }.        } /*
14ea0 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69   End loop over i
14eb0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20 20 20  ndexes */.      
14ec0 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61 66 66  } /* End if( aff
14ed0 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20  inity_ok ) */.  
14ee0 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f    } /* End if no
14ef0 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64 65 78  t an rowid index
14f00 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61   */.  } /* End a
14f10 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69  ttempt to optimi
14f20 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  ze using an inde
14f30 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  x */..  /* If no
14f40 20 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64   preexisting ind
14f50 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ex is available 
14f60 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73  for the IN claus
14f70 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e  e.  ** and IN_IN
14f80 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61  DEX_NOOP is an a
14f90 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a  llowed reply.  *
14fa0 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66  * and the RHS of
14fb0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
14fc0 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20   is a list, not 
14fd0 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  a subquery.  ** 
14fe0 61 6e 64 20 74 68 65 20 52 48 53 20 69 73 20 6e  and the RHS is n
14ff0 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68  ot constant or h
15000 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  as two or fewer 
15010 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e  terms,.  ** then
15020 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68   it is not worth
15030 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
15040 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
15050 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68  evaluate.  ** th
15060 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f  e IN operator so
15070 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58   return IN_INDEX
15080 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66  _NOOP..  */.  if
15090 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26  ( eType==0.   &&
150a0 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
150b0 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20  NDEX_NOOP_OK).  
150c0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
150d0 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
150e0 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21 73  elect).   && (!s
150f0 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
15100 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d  stant(pX) || pX-
15110 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c  >x.pList->nExpr<
15120 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79  =2).  ){.    eTy
15130 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  pe = IN_INDEX_NO
15140 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65  OP;.  }..  if( e
15150 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Type==0 ){.    /
15160 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  * Could not find
15170 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
15180 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75  le or index to u
15190 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d  se as the RHS b-
151a0 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  tree..    ** We 
151b0 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e  will have to gen
151c0 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  erate an ephemer
151d0 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74  al table to do t
151e0 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  he job..    */. 
151f0 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65     u32 savedNQue
15200 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
15210 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  >nQueryLoop;.   
15220 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
15230 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65  l = 0;.    eType
15240 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b   = IN_INDEX_EPH;
15250 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73  .    if( inFlags
15260 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
15270 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
15280 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30  ->nQueryLoop = 0
15290 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
152a0 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pLeft->iColumn<0
152b0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
152c0 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
152d0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
152e0 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
152f0 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  EX_ROWID;.      
15300 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
15310 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a  prRhsHasNull ){.
15320 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e        *prRhsHasN
15330 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75  ull = rMayHaveNu
15340 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
15350 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  Mem;.    }.    s
15360 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
15370 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20  ect(pParse, pX, 
15380 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54  rMayHaveNull, eT
15390 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
153a0 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65  WID);.    pParse
153b0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73  ->nQueryLoop = s
153c0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
153d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d    }else{.    pX-
153e0 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
153f0 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61 70    }..  if( aiMap
15400 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e   && eType!=IN_IN
15410 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26 26  DEX_INDEX_ASC &&
15420 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58   eType!=IN_INDEX
15430 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20  _INDEX_DESC ){. 
15440 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20     int i, n;.   
15450 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   n = sqlite3Expr
15460 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70  VectorSize(pX->p
15470 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  Left);.    for(i
15480 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69  =0; i<n; i++) ai
15490 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a  Map[i] = i;.  }.
154a0 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a    return eType;.
154b0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
154c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
154d0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67  BQUERY./*.** Arg
154e0 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20 61  ument pExpr is a
154f0 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e  n (?, ?...) IN(.
15500 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ..) expression. 
15510 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
15520 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  n allocates and 
15530 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65  returns a nul-te
15540 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
15550 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74  containing .** t
15560 68 65 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f  he affinities to
15570 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 61 63   be used for eac
15580 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
15590 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a  comparison..**.*
155a0 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
155b0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
155c0 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75  e caller to ensu
155d0 72 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75  re that the retu
155e0 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69  rned.** string i
155f0 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  s eventually fre
15600 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
15610 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  DbFree()..*/.sta
15620 74 69 63 20 63 68 61 72 20 2a 65 78 70 72 49 4e  tic char *exprIN
15630 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a  Affinity(Parse *
15640 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
15650 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c  xpr){.  Expr *pL
15660 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
15670 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d  ft;.  int nVal =
15680 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
15690 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20  orSize(pLeft);. 
156a0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
156b0 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73   = (pExpr->flags
156c0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
156d0 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   ? pExpr->x.pSel
156e0 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72 20  ect : 0;.  char 
156f0 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72 74  *zRet;..  assert
15700 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
15710 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20 73  IN );.  zRet = s
15720 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
15730 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56  w(pParse->db, nV
15740 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52 65  al+1);.  if( zRe
15750 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
15760 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
15770 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Val; i++){.     
15780 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71 6c 69   Expr *pA = sqli
15790 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
157a0 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
157b0 0a 20 20 20 20 20 20 63 68 61 72 20 61 20 3d 20  .      char a = 
157c0 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
157d0 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20 20 69  ity(pA);.      i
157e0 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
157f0 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20        zRet[i] = 
15800 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
15810 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74 2d 3e  finity(pSelect->
15820 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
15830 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20 7d 65  pr, a);.      }e
15840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  lse{.        zRe
15850 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20 20 20  t[i] = a;.      
15860 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74  }.    }.    zRet
15870 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20  [nVal] = '\0';. 
15880 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74   }.  return zRet
15890 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
158a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
158b0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c  SUBQUERY./*.** L
158c0 6f 61 64 20 74 68 65 20 50 61 72 73 65 20 6f 62  oad the Parse ob
158d0 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
158e0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
158f0 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  t with an error 
15900 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66 20 74  .** message of t
15910 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
15920 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74   "sub-select ret
15930 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d  urns N columns -
15940 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a 2f 20   expected M".*/ 
15950 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53    .void sqlite3S
15960 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 50 61  ubselectError(Pa
15970 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
15980 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20 6e 45   nActual, int nE
15990 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73 74 20  xpect){.  const 
159a0 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22 73 75  char *zFmt = "su
159b0 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
159c0 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78   %d columns - ex
159d0 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20 73 71  pected %d";.  sq
159e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
159f0 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41 63 74  arse, zFmt, nAct
15a00 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b 0a 7d  ual, nExpect);.}
15a10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45  .#endif../*.** E
15a20 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
15a30 69 73 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  is a vector that
15a40 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 69   has been used i
15a50 6e 20 61 20 63 6f 6e 74 65 78 74 20 77 68 65 72  n a context wher
15a60 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70  e.** it is not p
15a70 65 72 6d 69 74 74 65 64 2e 20 49 66 20 70 45 78  ermitted. If pEx
15a80 70 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  pr is a sub-sele
15a90 63 74 20 76 65 63 74 6f 72 2c 20 74 68 69 73 20  ct vector, this 
15aa0 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64  routine .** load
15ab0 73 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  s the Parse obje
15ac0 63 74 20 77 69 74 68 20 61 20 6d 65 73 73 61 67  ct with a messag
15ad0 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  e of the form:.*
15ae0 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65  *.**   "sub-sele
15af0 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c  ct returns N col
15b00 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
15b10 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  1".**.** Or, if 
15b20 69 74 20 69 73 20 61 20 72 65 67 75 6c 61 72 20  it is a regular 
15b30 73 63 61 6c 61 72 20 76 65 63 74 6f 72 3a 0a 2a  scalar vector:.*
15b40 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61 6c 75  *.**   "row valu
15b50 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20 20 20  e misused".*/   
15b60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 65 63  .void sqlite3Vec
15b70 74 6f 72 45 72 72 6f 72 4d 73 67 28 50 61 72 73  torErrorMsg(Pars
15b80 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
15b90 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e 64 65 66  *pExpr){.#ifndef
15ba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
15bb0 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70  QUERY.  if( pExp
15bc0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  r->flags & EP_xI
15bd0 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  sSelect ){.    s
15be0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
15bf0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 78  rror(pParse, pEx
15c00 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
15c10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29  EList->nExpr, 1)
15c20 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
15c30 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
15c40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15c50 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75   "row value misu
15c60 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  sed");.  }.}../*
15c70 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
15c80 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62  e for scalar sub
15c90 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
15ca0 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65  a subquery expre
15cb0 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a  ssion, EXISTS,.*
15cc0 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  * or IN operator
15cd0 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  s.  Examples:.**
15ce0 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20  .**     (SELECT 
15cf0 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20  a FROM b)       
15d00 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a     -- subquery.*
15d10 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45  *     EXISTS (SE
15d20 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
15d30 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75   -- EXISTS subqu
15d40 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ery.**     x IN 
15d50 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
15d60 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
15d70 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
15d80 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
15d90 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
15da0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
15db0 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
15dc0 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
15dd0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
15de0 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
15df0 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65  rameter describe
15e00 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
15e10 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
15e20 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f  he IN.** operato
15e30 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a  r or subquery..*
15e40 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
15e50 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e  r isRowid is non
15e60 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72  -zero, then expr
15e70 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
15e80 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
15e90 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
15ea0 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20  "<rowid> IN (?, 
15eb0 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72  ?, ?)", where <r
15ec0 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72  owid> is a refer
15ed0 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20  ence.** to some 
15ee0 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75  integer key colu
15ef0 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d  mn of a table B-
15f00 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
15f10 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e  se, use an.** in
15f20 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73  tkey B-Tree to s
15f30 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
15f40 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69  IN(...) values i
15f50 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
15f60 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20  ual.** (slower) 
15f70 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
15f80 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a  keys B-Tree..**.
15f90 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75  ** If rMayHaveNu
15fa0 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
15fb0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
15fc0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
15fd0 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61   an IN.** (not a
15fe0 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
15ff0 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  S) and that the 
16000 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  RHS might contai
16010 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c  ns NULLs..** All
16020 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
16030 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  es is initialize
16040 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67 69   the register gi
16050 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e  ven by rMayHaveN
16060 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20  ull.** to NULL. 
16070 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   Calling routine
16080 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65  s will take care
16090 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69   of changing thi
160a0 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61  s register.** va
160b0 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20  lue to non-NULL 
160c0 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55  if the RHS is NU
160d0 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46  LL-free..**.** F
160e0 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  or a SELECT or E
160f0 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20  XISTS operator, 
16100 72 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  return the regis
16110 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ter that holds t
16120 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46  he.** result.  F
16130 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d  or a multi-colum
16140 6e 20 53 45 4c 45 43 54 2c 20 74 68 65 20 72 65  n SELECT, the re
16150 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69  sult is stored i
16160 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a  n a contiguous.*
16170 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  * array of regis
16180 74 65 72 73 20 61 6e 64 20 74 68 65 20 72 65 74  ters and the ret
16190 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
161a0 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65   register of the
161b0 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65   left-most.** re
161c0 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 52 65  sult column.  Re
161d0 74 75 72 6e 20 30 20 66 6f 72 20 49 4e 20 6f 70  turn 0 for IN op
161e0 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e  erators or if an
161f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
16200 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
16210 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
16220 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  nt sqlite3CodeSu
16230 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  bselect(.  Parse
16240 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
16250 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
16260 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
16270 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
16280 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45     /* The IN, SE
16290 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20  LECT, or EXISTS 
162a0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
162b0 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20  t rHasNullFlag, 
162c0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
162d0 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77  r that records w
162e0 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69  hether NULLs exi
162f0 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69  st in RHS */.  i
16300 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20  nt isRowid      
16310 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
16320 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65  e, LHS of IN ope
16330 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64  rator is a rowid
16340 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70   */.){.  int jmp
16350 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20  IfDynamic = -1; 
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
16380 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f   test address */
16390 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b  .  int rReg = 0;
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
163c0 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72  gister storing r
163d0 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64  esulting */.  Vd
163e0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
163f0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16400 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
16410 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
16420 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16430 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20  Push(pParse);.. 
16440 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69   /* The evaluati
16450 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45 58 49  on of the IN/EXI
16460 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74 20  STS/SELECT must 
16470 62 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72  be repeated ever
16480 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69  y time it.  ** i
16490 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66  s encountered if
164a0 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
164b0 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20  owing is true:. 
164c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54   **.  **    *  T
164d0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
164e0 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  de is a correlat
164f0 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  ed subquery.  **
16500 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
16510 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e  -hand side is an
16520 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
16530 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69   containing vari
16540 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20  ables.  **    * 
16550 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61   We are inside a
16560 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20   trigger.  **.  
16570 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
16580 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65   above are false
16590 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75  , then we can ru
165a0 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74  n this code just
165b0 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20   once.  ** save 
165c0 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64  the results, and
165d0 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
165e0 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
165f0 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73  uent invocations
16600 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78  ..  */.  if( !Ex
16610 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16620 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
16630 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44  t) ){.    jmpIfD
16640 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33  ynamic = sqlite3
16650 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
16660 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
16670 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
16680 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
16690 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
166a0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
166b0 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
166c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
166d0 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
166e0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
166f0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
16700 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
16710 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20  ->pLeft; /* the 
16720 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
16730 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
16740 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16750 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b  o = 0;      /* K
16760 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ey information *
16770 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c  /.      int nVal
16780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16790 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76      /* Size of v
167a0 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20  ector pLeft */. 
167b0 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c       .      nVal
167c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
167d0 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
167e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
167f0 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d  isRowid || nVal=
16800 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =1 );..      /* 
16810 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
16820 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
16830 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
16840 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
16850 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
16860 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
16870 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41  the same way.  A
16880 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
16890 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
168a0 69 6c 6c 65 64 20 77 69 74 68 20 69 6e 64 65 78  illed with index
168b0 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69   keys representi
168c0 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  ng the results f
168d0 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  rom the .      *
168e0 2a 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  * SELECT or the 
168f0 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
16900 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
16910 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
16920 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
16930 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
16940 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
16950 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
16960 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
16970 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
16980 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
16990 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
169a0 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
169b0 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
169c0 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
169d0 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
169e0 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
169f0 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
16a00 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
16a10 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
16a20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
16a30 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
16a40 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
16a50 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
16a60 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
16a70 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
16a80 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
16a90 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
16aa0 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
16ab0 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
16ac0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
16ad0 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
16ae0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
16af0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
16b00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16b10 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
16b20 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70   .          pExp
16b30 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f  r->iTable, (isRo
16b40 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20  wid?0:nVal));.  
16b50 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69      pKeyInfo = i
16b60 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c  sRowid ? 0 : sql
16b70 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
16b80 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61  (pParse->db, nVa
16b90 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66  l, 1);..      if
16ba0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
16bb0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
16bc0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
16bd0 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
16be0 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
16bf0 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
16c00 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
16c10 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
16c20 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
16c30 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
16c40 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
16c50 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
16c60 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
16c70 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
16c80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16c90 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
16ca0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
16cb0 63 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  ct;.        Expr
16cc0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
16cd0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
16ce0 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
16cf0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
16d00 65 2c 20 31 2c 20 22 25 73 4c 49 53 54 20 53 55  e, 1, "%sLIST SU
16d10 42 51 55 45 52 59 22 2c 0a 20 20 20 20 20 20 20  BQUERY",.       
16d20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
16d30 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41  c>=0?"":"CORRELA
16d40 54 45 44 20 22 0a 20 20 20 20 20 20 20 20 29 29  TED ".        ))
16d50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16d60 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
16d70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16d80 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74  LHS and RHS of t
16d90 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64  he IN operator d
16da0 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61  o not match, tha
16db0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72  t.        ** err
16dc0 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  or will have bee
16dd0 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65  n caught long be
16de0 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74 68  fore we reach th
16df0 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20  is point. */.   
16e00 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
16e10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e  pEList->nExpr==n
16e20 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
16e30 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
16e40 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  t;.          int
16e50 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   i;.          sq
16e60 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
16e70 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
16e80 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
16e90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65  e);.          de
16ea0 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78  st.zAffSdst = ex
16eb0 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61  prINAffinity(pPa
16ec0 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
16ed0 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e         pSelect->
16ee0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
16ef0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16f00 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
16f10 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
16f20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
16f30 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d  tcase( pKeyInfo=
16f40 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20  =0 ); /* Caused 
16f50 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65  by OOM in sqlite
16f60 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20  3KeyInfoAlloc() 
16f70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
16f80 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
16f90 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
16fa0 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
16fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
16fc0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
16fd0 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16ff0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
17000 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pKeyInfo);.     
17010 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
17020 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
17040 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
17050 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b   dest.zAffSdst);
17060 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17070 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
17080 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
17090 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
170a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
170b0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
170c0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
170d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
170e0 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
170f0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >0 );.          
17100 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
17110 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
17120 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
17130 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
17140 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
17150 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
17160 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
17170 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
17180 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
17190 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
171a0 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  >aColl[i] = sqli
171b0 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
171c0 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20 20  CollSeq(.       
171d0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
171e0 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   p, pEList->a[i]
171f0 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20 20 20  .pExpr.         
17200 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
17210 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
17220 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
17230 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
17240 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
17250 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
17260 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
17270 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
17280 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63        ** For eac
17290 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
172a0 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
172b0 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
172c0 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
172d0 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
172e0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
172f0 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
17300 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
17310 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
17320 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
17330 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
17340 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
17350 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
17360 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
17370 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
17380 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
17390 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
173a0 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
173b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
173c0 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20  nity of the LHS 
173d0 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20  of the IN */.   
173e0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
173f0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
17400 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
17410 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74  List;.        st
17420 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
17430 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
17440 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
17450 33 3b 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e  3;.        affin
17460 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
17470 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
17480 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  ;.        if( !a
17490 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
174a0 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
174b0 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
174c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
174d0 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
174e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
174f0 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
17500 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
17510 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
17520 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
17530 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
17540 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
17550 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
17560 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ft);.        }..
17570 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
17580 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
17590 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
175a0 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
175b0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
175c0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
175d0 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
175e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
175f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17600 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20    if( isRowid ) 
17610 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17620 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c  4(v, OP_Blob, 0,
17630 20 72 32 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53   r2, 0, "", P4_S
17640 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
17650 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
17660 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
17670 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
17680 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
17690 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
176a0 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
176b0 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f        int iValTo
176c0 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  Ins;..          
176d0 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  /* If the expres
176e0 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73  sion is not cons
176f0 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c  tant then we wil
17700 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  l need to.      
17710 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
17720 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
17730 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
17740 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
17750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
17760 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65  is code only exe
17770 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63  cutes once.  Bec
17780 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63  ause for a non-c
17790 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20  onstant.        
177a0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
177b0 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e  we need to rerun
177c0 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20   this code each 
177d0 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20  time..          
177e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
177f0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
17800 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
17810 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
17820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
17830 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17840 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44  ToNoop(v, jmpIfD
17850 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20 20 20  ynamic);.       
17860 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
17870 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
17880 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
17890 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
178a0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
178b0 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
178c0 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
178d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
178e0 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45  owid && sqlite3E
178f0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32  xprIsInteger(pE2
17900 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b  , &iValToIns) ){
17910 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
17920 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17930 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20  , OP_InsertInt, 
17940 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
17950 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20  2, iValToIns);. 
17960 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
17970 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d              r3 =
17980 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17990 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
179a0 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
179b0 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
179c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
179d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
179e0 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
179f0 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  Int, r3,.       
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17a20 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
17a30 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20  v)+2);.         
17a40 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
17a50 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
17a60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17a70 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
17a80 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
17a90 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20  e, r2, r3);.    
17aa0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
17ac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17ad0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
17ae0 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66   r3, 1, r2, &aff
17af0 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
17b00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17b10 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
17b20 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
17b30 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r3, 1);.        
17b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17b50 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
17b60 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70  _IdxInsert, pExp
17b70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
17b80 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 1);.         
17b90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
17ba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17bb0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17bc0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17bd0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
17be0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17bf0 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
17c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17c10 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
17c20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17c30 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
17c40 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79  dr, (void *)pKey
17c50 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
17c60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17c70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
17c80 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
17c90 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
17ca0 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75  ELECT:.    defau
17cb0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43  lt: {.      /* C
17cc0 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45 43  ase 3:    (SELEC
17cd0 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a  T ... FROM ...).
17ce0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a        **     or:
17cf0 20 20 20 20 45 58 49 53 54 53 28 53 45 4c 45 43      EXISTS(SELEC
17d00 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a  T ... FROM ...).
17d10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17d20 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20  * For a SELECT, 
17d30 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
17d40 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20   put the values 
17d50 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  for all columns 
17d60 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
17d70 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20 61  first row into a
17d80 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
17d90 74 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ters and return 
17da0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20 20  the index of.   
17db0 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
17dc0 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20 20  register..      
17dd0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
17de0 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53  his is an EXISTS
17df0 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67  , write an integ
17e00 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73  er 0 (not exists
17e10 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a  ) or 1 (exists).
17e20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20        ** into a 
17e30 72 65 67 69 73 74 65 72 20 61 6e 64 20 72 65 74  register and ret
17e40 75 72 6e 20 74 68 61 74 20 72 65 67 69 73 74 65  urn that registe
17e50 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20  r number..      
17e60 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 62  **.      ** In b
17e70 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 71  oth cases, the q
17e80 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65  uery is augmente
17e90 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22  d with "LIMIT 1"
17ea0 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a  .  Any .      **
17eb0 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d   preexisting lim
17ec0 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 20  it is discarded 
17ed0 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
17ee0 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20  new LIMIT 1..   
17ef0 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65     */.      Sele
17f00 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20  ct *pSel;       
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
17f30 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20  ement to encode 
17f40 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  */.      SelectD
17f50 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20  est dest;       
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17f70 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69  * How to deal wi
17f80 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  th SELECT result
17f90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 52   */.      int nR
17fa0 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f 20  /* Registers to 
17fd0 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 20 20  allocate */.    
17fe0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20    Expr *pLimit; 
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18000 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c          /* New l
18010 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20  imit expression 
18020 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  */..      testca
18030 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
18040 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
18050 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
18060 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
18070 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
18080 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
18090 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d  EXISTS || pExpr-
180a0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
180b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
180c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
180d0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
180e0 65 63 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  ect) );..      p
180f0 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  Sel = pExpr->x.p
18100 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78  Select;.      Ex
18110 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
18120 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 53 43  pParse, 1, "%sSC
18130 41 4c 41 52 20 53 55 42 51 55 45 52 59 22 2c 0a  ALAR SUBQUERY",.
18140 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49              jmpI
18150 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22  fDynamic>=0?"":"
18160 43 4f 52 52 45 4c 41 54 45 44 20 22 29 29 3b 0a  CORRELATED "));.
18170 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70 45 78        nReg = pEx
18180 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
18190 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  T ? pSel->pEList
181a0 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20 20  ->nExpr : 1;.   
181b0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
181c0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
181d0 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  0, pParse->nMem+
181e0 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
181f0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
18200 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
18210 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
18220 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
18230 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a  Dest = SRT_Mem;.
18240 20 20 20 20 20 20 20 20 64 65 73 74 2e 69 53 64          dest.iSd
18250 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  st = dest.iSDPar
18260 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  m;.        dest.
18270 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20  nSdst = nReg;.  
18280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18290 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
182a0 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  ll, 0, dest.iSDP
182b0 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50 61 72  arm, dest.iSDPar
182c0 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20 20  m+nReg-1);.     
182d0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
182e0 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72  v, "Init subquer
182f0 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
18300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18310 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
18320 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20  RT_Exists;.     
18330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18340 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
18350 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  er, 0, dest.iSDP
18360 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
18370 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
18380 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
18390 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t"));.      }.  
183a0 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 73 71 6c      pLimit = sql
183b0 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
183c0 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54  arse->db, TK_INT
183d0 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49 6e 74  EGER,&sqlite3Int
183e0 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20  Tokens[1], 0);. 
183f0 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 70       if( pSel->p
18400 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
18410 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
18420 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
18430 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65  Sel->pLimit->pLe
18440 66 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65  ft);.        pSe
18450 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  l->pLimit->pLeft
18460 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
18470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18480 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pSel->pLimit = s
18490 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
184a0 73 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c 20 70 4c  se, TK_LIMIT, pL
184b0 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  imit, 0);.      
184c0 7d 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  }.      pSel->iL
184d0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
184e0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
184f0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
18500 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
18510 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
18520 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d    }.      rReg =
18530 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
18540 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
18550 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18560 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
18570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18580 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e    }..  if( rHasN
18590 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  ullFlag ){.    s
185a0 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
185b0 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69  Flag(v, pExpr->i
185c0 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46  Table, rHasNullF
185d0 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lag);.  }..  if(
185e0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
185f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
18600 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
18610 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
18620 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
18630 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
18640 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b  ..  return rReg;
18650 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
18660 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
18670 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
18680 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
18690 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49  RY./*.** Expr pI
186a0 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20  n is an IN(...) 
186b0 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73  expression. This
186c0 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
186d0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75   that the .** su
186e0 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20  b-select on the 
186f0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20  RHS of the IN() 
18700 6f 70 65 72 61 74 6f 72 20 68 61 73 20 74 68 65  operator has the
18710 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
18720 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74  .** columns as t
18730 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65  he vector on the
18740 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65   LHS. Or, if the
18750 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29   RHS of the IN()
18760 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75   is not .** a su
18770 62 2d 71 75 65 72 79 2c 20 74 68 61 74 20 74 68  b-query, that th
18780 65 20 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f  e LHS is a vecto
18790 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a  r of size 1..*/.
187a0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
187b0 68 65 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50  heckIN(Parse *pP
187c0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29  arse, Expr *pIn)
187d0 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20  {.  int nVector 
187e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
187f0 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65  torSize(pIn->pLe
18800 66 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d  ft);.  if( (pIn-
18810 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
18820 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66  elect) ){.    if
18830 28 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e  ( nVector!=pIn->
18840 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
18850 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
18860 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
18870 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
18880 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  pIn->x.pSelect->
18890 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e  pEList->nExpr, n
188a0 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72  Vector);.      r
188b0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
188c0 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74   }else if( nVect
188d0 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  or!=1 ){.    sql
188e0 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d  ite3VectorErrorM
188f0 73 67 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  sg(pParse, pIn->
18900 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75  pLeft);.    retu
18910 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
18920 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
18930 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18940 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
18950 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
18960 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65   for an IN expre
18970 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
18980 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
18990 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  ..).**      x IN
189a0 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
189b0 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ...).**.** The l
189c0 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c  eft-hand side (L
189d0 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20  HS) is a scalar 
189e0 6f 72 20 76 65 63 74 6f 72 20 65 78 70 72 65 73  or vector expres
189f0 73 69 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72  sion.  The .** r
18a00 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28  ight-hand side (
18a10 52 48 53 29 20 69 73 20 61 6e 20 61 72 72 61 79  RHS) is an array
18a20 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
18a30 20 73 63 61 6c 61 72 20 76 61 6c 75 65 73 2c 20   scalar values, 
18a40 6f 72 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79  or a.** subquery
18a50 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
18a60 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
18a70 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
18a80 74 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a  t columns must.*
18a90 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  * match the numb
18aa0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
18ab0 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74   the vector on t
18ac0 68 65 20 4c 48 53 2e 20 20 49 66 20 74 68 65 20  he LHS.  If the 
18ad0 52 48 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74  RHS is.** a list
18ae0 20 6f 66 20 76 61 6c 75 65 73 2c 20 74 68 65 20   of values, the 
18af0 4c 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 63  LHS must be a sc
18b00 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  alar. .**.** The
18b10 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
18b20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20  true if the LHS 
18b30 76 61 6c 75 65 20 69 73 20 63 6f 6e 74 61 69 6e  value is contain
18b40 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
18b50 53 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  S..** The result
18b60 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
18b70 20 4c 48 53 20 69 73 20 64 65 66 69 6e 69 74 65   LHS is definite
18b80 6c 79 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 48  ly not in the RH
18b90 53 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 73 75  S.  The .** resu
18ba0 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  lt is NULL if th
18bb0 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 74 68  e presence of th
18bc0 65 20 4c 48 53 20 69 6e 20 74 68 65 20 52 48 53  e LHS in the RHS
18bd0 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64   cannot be .** d
18be0 65 74 65 72 6d 69 6e 65 64 20 64 75 65 20 74 6f  etermined due to
18bf0 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   NULLs..**.** Th
18c00 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
18c10 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a  ates code that j
18c20 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61  umps to destIfFa
18c30 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
18c40 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
18c50 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
18c60 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
18c70 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
18c80 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
18c90 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
18ca0 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
18cb0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
18cc0 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
18cd0 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
18ce0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
18cf0 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
18d00 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ough..**.** See 
18d10 74 68 65 20 73 65 70 61 72 61 74 65 20 69 6e 2d  the separate in-
18d20 6f 70 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75  operator.md docu
18d30 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20 69  mentation file i
18d40 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a  n the canonical.
18d50 2a 2a 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65  ** SQLite source
18d60 20 74 72 65 65 20 66 6f 72 20 61 64 64 69 74 69   tree for additi
18d70 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
18d80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18d90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18da0 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  IN(.  Parse *pPa
18db0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
18dc0 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
18dd0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
18de0 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
18df0 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
18e00 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69   The IN expressi
18e10 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
18e20 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a  IfFalse,      /*
18e30 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48   Jump here if LH
18e40 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
18e50 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f  ed in the RHS */
18e60 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c  .  int destIfNul
18e70 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  l        /* Jump
18e80 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73   here if the res
18e90 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e  ults are unknown
18ea0 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f   due to NULLs */
18eb0 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61  .){.  int rRhsHa
18ec0 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52  sNull = 0;  /* R
18ed0 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20  egister that is 
18ee0 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74  true if RHS cont
18ef0 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
18f00 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
18f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18f20 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a  ype of the RHS *
18f30 2f 0a 20 20 69 6e 74 20 72 4c 68 73 3b 20 20 20  /.  int rLhs;   
18f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
18f50 69 73 74 65 72 28 73 29 20 68 6f 6c 64 69 6e 67  ister(s) holding
18f60 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 73 20   the LHS values 
18f70 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72 69  */.  int rLhsOri
18f80 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48  g;         /* LH
18f90 53 20 76 61 6c 75 65 73 20 70 72 69 6f 72 20 74  S values prior t
18fa0 6f 20 72 65 6f 72 64 65 72 69 6e 67 20 62 79 20  o reordering by 
18fb0 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62  aiMap[] */.  Vdb
18fc0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
18fd0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
18fe0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18ff0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d  on */.  int *aiM
19000 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ap = 0;       /*
19010 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74 6f 72   Map from vector
19020 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65 78 20   field to index 
19030 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
19040 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20 20 20   *zAff = 0;     
19050 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74    /* Affinity st
19060 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72 69  ring for compari
19070 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  sons */.  int nV
19080 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ector;          
19090 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f  /* Size of vecto
190a0 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f  rs for this IN o
190b0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
190c0 20 69 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20   iDummy;        
190d0 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61     /* Dummy para
190e0 6d 65 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64  meter to exprCod
190f0 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45  eVector() */.  E
19100 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  xpr *pLeft;     
19110 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20       /* The LHS 
19120 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
19130 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  or */.  int i;  
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19150 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
19160 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 32  .  int destStep2
19170 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ;        /* Wher
19180 65 20 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e  e to jump when N
19190 55 4c 4c 73 20 73 65 65 6e 20 69 6e 20 73 74 65  ULLs seen in ste
191a0 70 20 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  p 2 */.  int des
191b0 74 53 74 65 70 36 20 3d 20 30 3b 20 20 20 20 2f  tStep6 = 0;    /
191c0 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20  * Start of code 
191d0 66 6f 72 20 53 74 65 70 20 36 20 2a 2f 0a 20 20  for Step 6 */.  
191e0 69 6e 74 20 61 64 64 72 54 72 75 74 68 4f 70 3b  int addrTruthOp;
191f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
19200 20 6f 66 20 6f 70 63 6f 64 65 20 74 68 61 74 20   of opcode that 
19210 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 49  determines the I
19220 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  N is true */.  i
19230 6e 74 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20  nt destNotNull; 
19240 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
19250 65 20 69 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  e if a compariso
19260 6e 20 69 73 20 6e 6f 74 20 74 72 75 65 20 69 6e  n is not true in
19270 20 73 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74   step 6 */.  int
19280 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
19290 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
192a0 20 73 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20   step-6 loop */ 
192b0 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70  ..  pLeft = pExp
192c0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 66 28 20  r->pLeft;.  if( 
192d0 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
192e0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
192f0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41  ) ) return;.  zA
19300 66 66 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e  ff = exprINAffin
19310 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70  ity(pParse, pExp
19320 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72 20 3d 20  r);.  nVector = 
19330 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
19340 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65  rSize(pExpr->pLe
19350 66 74 29 3b 0a 20 20 61 69 4d 61 70 20 3d 20 28  ft);.  aiMap = (
19360 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  int*)sqlite3DbMa
19370 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 20 20  llocZero(.      
19380 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 65 63  pParse->db, nVec
19390 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69 6e 74 29  tor*(sizeof(int)
193a0 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 29 29   + sizeof(char))
193b0 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69 66 28 20   + 1.  );.  if( 
193c0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
193d0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
193e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
193f0 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20  N_oom_error;..  
19400 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f  /* Attempt to co
19410 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 41  mpute the RHS. A
19420 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20  fter this step, 
19430 69 66 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  if anything othe
19440 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49  r than.  ** IN_I
19450 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74  NDEX_NOOP is ret
19460 75 72 6e 65 64 2c 20 74 68 65 20 74 61 62 6c 65  urned, the table
19470 20 6f 70 65 6e 65 64 20 69 74 68 20 63 75 72 73   opened ith curs
19480 6f 72 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  or pExpr->iTable
19490 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   .  ** contains 
194a0 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
194b0 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
194c0 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   If IN_INDEX_NOO
194d0 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20  P is returned,. 
194e0 20 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73 20   ** the RHS has 
194f0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
19500 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50  ed.  */.  v = pP
19510 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
19520 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
19530 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65       /* OOM dete
19540 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  cted prior to th
19550 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
19560 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
19570 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
19580 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d  pr"));.  eType =
19590 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
195a0 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
195b0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195d0 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
195e0 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e  HIP | IN_INDEX_N
195f0 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20  OOP_OK,.        
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19610 20 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65       destIfFalse
19620 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30  ==destIfNull ? 0
19630 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c   : &rRhsHasNull,
19640 20 61 69 4d 61 70 29 3b 0a 0a 20 20 61 73 73 65   aiMap);..  asse
19650 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
19660 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c   || nVector==1 |
19670 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  | eType==IN_INDE
19680 58 5f 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20  X_EPH.       || 
19690 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
196a0 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79  INDEX_ASC || eTy
196b0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
196c0 45 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69  EX_DESC .  );.#i
196d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
196e0 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74  G.  /* Confirm t
196f0 68 61 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74  hat aiMap[] cont
19700 61 69 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74  ains nVector int
19710 65 67 65 72 20 76 61 6c 75 65 73 20 62 65 74 77  eger values betw
19720 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e  een 0 and.  ** n
19730 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66  Vector-1. */.  f
19740 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
19750 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  r; i++){.    int
19760 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72   j, cnt;.    for
19770 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63  (cnt=j=0; j<nVec
19780 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69  tor; j++) if( ai
19790 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b  Map[j]==i ) cnt+
197a0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  +;.    assert( c
197b0 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e  nt==1 );.  }.#en
197c0 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74  dif..  /* Code t
197d0 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70  he LHS, the <exp
197e0 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
197f0 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68  IN (...)". If th
19800 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a  e LHS is a .  **
19810 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74   vector, then it
19820 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e   is stored in an
19830 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f   array of nVecto
19840 72 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  r registers star
19850 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31  ting .  ** at r1
19860 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69  ..  **.  ** sqli
19870 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29  te3FindInIndex()
19880 20 6d 69 67 68 74 20 68 61 76 65 20 72 65 6f 72   might have reor
19890 64 65 72 65 64 20 74 68 65 20 66 69 65 6c 64 73  dered the fields
198a0 20 6f 66 20 74 68 65 20 4c 48 53 20 76 65 63 74   of the LHS vect
198b0 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  or.  ** so that 
198c0 74 68 65 20 66 69 65 6c 64 73 20 61 72 65 20 69  the fields are i
198d0 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
198e0 20 61 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   as an existing 
198f0 69 6e 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a  index.   The.  *
19900 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20  * aiMap[] array 
19910 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69  contains a mappi
19920 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67  ng from the orig
19930 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f  inal LHS field o
19940 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  rder to.  ** the
19950 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61   field order tha
19960 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 52 48  t matches the RH
19970 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20  S index..  */.  
19980 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19990 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
199a0 72 4c 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43  rLhsOrig = exprC
199b0 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
199c0 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79  , pLeft, &iDummy
199d0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
199e0 6e 56 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70  nVector && aiMap
199f0 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f  [i]==i; i++){} /
19a00 2a 20 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73  * Are LHS fields
19a10 20 72 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20   reordered? */. 
19a20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20   if( i==nVector 
19a30 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69  ){.    /* LHS fi
19a40 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f  elds are not reo
19a50 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c  rdered */.    rL
19a60 68 73 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20  hs = rLhsOrig;. 
19a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e   }else{.    /* N
19a80 65 65 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74  eed to reorder t
19a90 68 65 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63  he LHS fields ac
19aa0 63 6f 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70  cording to aiMap
19ab0 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73   */.    rLhs = s
19ac0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
19ad0 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74  ge(pParse, nVect
19ae0 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  or);.    for(i=0
19af0 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
19b00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19b10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19b20 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b  _Copy, rLhsOrig+
19b30 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d  i, rLhs+aiMap[i]
19b40 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
19b50 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33  .  /* If sqlite3
19b60 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69  FindInIndex() di
19b70 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72  d not find or cr
19b80 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68  eate an index th
19b90 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61  at is.  ** suita
19ba0 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ble for evaluati
19bb0 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ng the IN operat
19bc0 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  or, then evaluat
19bd0 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73  e using a.  ** s
19be0 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
19bf0 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a  risons..  **.  *
19c00 2a 20 54 68 69 73 20 69 73 20 73 74 65 70 20 28  * This is step (
19c10 31 29 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65  1) in the in-ope
19c20 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a  rator.md optimiz
19c30 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20  ed algorithm..  
19c40 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
19c50 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b  IN_INDEX_NOOP ){
19c60 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
19c70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
19c80 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53  pList;.    CollS
19c90 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
19ca0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
19cb0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
19cc0 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61  eft);.    int la
19cd0 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  belOk = sqlite3V
19ce0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19cf0 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67  .    int r2, reg
19d00 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20  ToFree;.    int 
19d10 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20  regCkNull = 0;. 
19d20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61     int ii;.    a
19d30 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
19d40 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
19d50 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
19d60 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75      if( destIfNu
19d70 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
19d80 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75  ){.      regCkNu
19d90 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ll = sqlite3GetT
19da0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
19db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19dc0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
19dd0 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72 4c 68 73  tAnd, rLhs, rLhs
19de0 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
19df0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
19e00 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ; ii<pList->nExp
19e10 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
19e20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
19e30 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
19e40 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45   pList->a[ii].pE
19e50 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29  xpr, &regToFree)
19e60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 43  ;.      if( regC
19e70 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33  kNull && sqlite3
19e80 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c  ExprCanBeNull(pL
19e90 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ist->a[ii].pExpr
19ea0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
19eb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19ec0 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67  , OP_BitAnd, reg
19ed0 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43  CkNull, r2, regC
19ee0 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  kNull);.      }.
19ef0 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69        if( ii<pLi
19f00 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64  st->nExpr-1 || d
19f10 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
19f20 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
19f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19f40 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 4c  Op4(v, OP_Eq, rL
19f50 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c  hs, labelOk, r2,
19f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f70 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
19f80 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
19f90 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64  SEQ);.        Vd
19fa0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
19fb0 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
19fc0 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
19fd0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69  CoverageIf(v, ii
19fe0 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  ==pList->nExpr-1
19ff0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a000 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1a010 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20  , zAff[0]);.    
1a020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a030 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66 4e   assert( destIfN
1a040 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65  ull==destIfFalse
1a050 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1a060 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a070 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c 20 64 65   OP_Ne, rLhs, de
1a080 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20  stIfFalse, r2,. 
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
1a0b0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
1a0c0 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  Q); VdbeCoverage
1a0d0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
1a0e0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1a0f0 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51  (v, zAff[0] | SQ
1a100 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1a110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a120 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a130 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1a140 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a  gToFree);.    }.
1a150 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
1a160 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
1a170 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a180 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b  OP_IsNull, regCk
1a190 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c  Null, destIfNull
1a1a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a1b0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
1a1c0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
1a1d0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d  tIfFalse);.    }
1a1e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a1f0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1a200 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71  labelOk);.    sq
1a210 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a220 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43  Reg(pParse, regC
1a230 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74 6f  kNull);.    goto
1a240 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a250 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d  IN_finished;.  }
1a260 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32 3a 20 43  ..  /* Step 2: C
1a270 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1a280 68 65 20 4c 48 53 20 63 6f 6e 74 61 69 6e 73 20  he LHS contains 
1a290 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  any NULL columns
1a2a0 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 4c  .  If the.  ** L
1a2b0 48 53 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20  HS does contain 
1a2c0 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68 65 20 72  NULLs then the r
1a2d0 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 65 69  esult must be ei
1a2e0 74 68 65 72 20 46 41 4c 53 45 20 6f 72 20 4e 55  ther FALSE or NU
1a2f0 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c  LL..  ** We will
1a300 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 62   then skip the b
1a310 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66 20  inary search of 
1a320 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
1a330 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  if( destIfNull==
1a340 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
1a350 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
1a360 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 65  estIfFalse;.  }e
1a370 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 53 74 65  lse{.    destSte
1a380 70 32 20 3d 20 64 65 73 74 53 74 65 70 36 20 3d  p2 = destStep6 =
1a390 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1a3a0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 0a 20 20  Label(v);.  }.  
1a3b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
1a3c0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  or; i++){.    Ex
1a3d0 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56  pr *p = sqlite3V
1a3e0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
1a3f0 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  r(pExpr->pLeft, 
1a400 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  i);.    if( sqli
1a410 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
1a420 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  (p) ){.      sql
1a430 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a440 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68  , OP_IsNull, rLh
1a450 73 2b 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b  s+i, destStep2);
1a460 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1a470 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
1a480 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20  }..  /* Step 3. 
1a490 20 54 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20   The LHS is now 
1a4a0 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d  known to be non-
1a4b0 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69  NULL.  Do the bi
1a4c0 6e 61 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a  nary search.  **
1a4d0 20 6f 66 20 74 68 65 20 52 48 53 20 75 73 69 6e   of the RHS usin
1a4e0 67 20 74 68 65 20 4c 48 53 20 61 73 20 61 20 70  g the LHS as a p
1a4f0 72 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c  robe.  If found,
1a500 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20   the result is. 
1a510 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20   ** true..  */. 
1a520 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
1a530 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
1a540 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
1a550 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68  e, the RHS is th
1a560 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65  e ROWID of table
1a570 20 62 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77   b-tree and so w
1a580 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e  e also.    ** kn
1a590 6f 77 20 74 68 61 74 20 74 68 65 20 52 48 53 20  ow that the RHS 
1a5a0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65  is non-NULL.  He
1a5b0 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20  nce, we combine 
1a5c0 73 74 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20  steps 3 and 4.  
1a5d0 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67    ** into a sing
1a5e0 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  le opcode. */.  
1a5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a600 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
1a610 77 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  wid, pExpr->iTab
1a620 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
1a630 20 72 4c 68 73 29 3b 0a 20 20 20 20 56 64 62 65   rLhs);.    Vdbe
1a640 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a650 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73   addrTruthOp = s
1a660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1a670 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f  (v, OP_Goto);  /
1a680 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 2a 2f  * Return True */
1a690 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1a6a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1a6b0 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
1a6c0 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30  rLhs, nVector, 0
1a6d0 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72 29  , zAff, nVector)
1a6e0 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66  ;.    if( destIf
1a6f0 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
1a700 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f  l ){.      /* Co
1a710 6d 62 69 6e 65 20 53 74 65 70 20 33 20 61 6e 64  mbine Step 3 and
1a720 20 53 74 65 70 20 35 20 69 6e 74 6f 20 61 20 73   Step 5 into a s
1a730 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  ingle opcode */.
1a740 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a750 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1a760 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72  _NotFound, pExpr
1a770 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
1a780 46 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 20  False,.         
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29    rLhs, nVector)
1a7b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a7c0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 71  );.      goto sq
1a7d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
1a7e0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
1a7f0 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20      /* Ordinary 
1a800 53 74 65 70 20 33 2c 20 66 6f 72 20 74 68 65 20  Step 3, for the 
1a810 63 61 73 65 20 77 68 65 72 65 20 46 41 4c 53 45  case where FALSE
1a820 20 61 6e 64 20 4e 55 4c 4c 20 61 72 65 20 64 69   and NULL are di
1a830 73 74 69 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64  stinct */.    ad
1a840 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69  drTruthOp = sqli
1a850 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1a860 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
1a870 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 0a  xpr->iTable, 0,.
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63        rLhs, nVec
1a8b0 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  tor); VdbeCovera
1a8c0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
1a8d0 20 53 74 65 70 20 34 2e 20 20 49 66 20 74 68 65   Step 4.  If the
1a8e0 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f   RHS is known to
1a8f0 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64   be non-NULL and
1a900 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64   we did not find
1a910 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f  .  ** an match o
1a920 6e 20 74 68 65 20 73 65 61 72 63 68 20 61 62 6f  n the search abo
1a930 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
1a940 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41 4c 53  ult must be FALS
1a950 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 52  E..  */.  if( rR
1a960 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65  hsHasNull && nVe
1a970 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73  ctor==1 ){.    s
1a980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a990 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
1a9a0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73  rRhsHasNull, des
1a9b0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 56  tIfFalse);.    V
1a9c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a9d0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35    }..  /* Step 5
1a9e0 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  .  If we do not 
1a9f0 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 64  care about the d
1aa00 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1aa10 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20  n NULL and.  ** 
1aa20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73 74  FALSE, then just
1aa30 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a   return false. .
1aa40 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49    */.  if( destI
1aa50 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
1aa60 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ll ) sqlite3Vdbe
1aa70 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
1aa80 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70  lse);..  /* Step
1aa90 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   6: Loop through
1aaa0 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52 48 53   rows of the RHS
1aab0 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63 68 20  .  Compare each 
1aac0 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a  row to the LHS..
1aad0 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70    ** If any comp
1aae0 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  arison is NULL, 
1aaf0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1ab00 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c  is NULL.  If all
1ab10 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  .  ** comparison
1ab20 73 20 61 72 65 20 46 41 4c 53 45 20 74 68 65 6e  s are FALSE then
1ab30 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
1ab40 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a  t is FALSE..  **
1ab50 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c  .  ** For a scal
1ab60 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20 73 75  ar LHS, it is su
1ab70 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68 65 63  fficient to chec
1ab80 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  k just the first
1ab90 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65   row.  ** of the
1aba0 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   RHS..  */.  if(
1abb0 20 64 65 73 74 53 74 65 70 36 20 29 20 73 71 6c   destStep6 ) sql
1abc0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1abd0 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74 65 70  abel(v, destStep
1abe0 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20  6);.  addrTop = 
1abf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ac00 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
1ac10 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
1ac20 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 56  estIfFalse);.  V
1ac30 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1ac40 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
1ac50 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75  ){.    destNotNu
1ac60 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
1ac70 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1ac80 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f  }else{.    /* Fo
1ac90 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f  r nVector==1, co
1aca0 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e  mbine steps 6 an
1acb0 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65  d 7 by immediate
1acc0 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  ly returning.   
1acd0 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65   ** FALSE if the
1ace0 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f   first compariso
1acf0 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  n is not NULL */
1ad00 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  .    destNotNull
1ad10 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
1ad20 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1ad30 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1ad40 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
1ad50 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1ad60 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71  .    int r3 = sq
1ad70 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1ad80 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d  pParse);.    p =
1ad90 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
1ada0 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
1adb0 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  , i);.    pColl 
1adc0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1add0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
1ade0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1adf0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1ae00 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
1ae10 6c 65 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20  le, i, r3);.    
1ae20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ae30 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73  4(v, OP_Ne, rLhs
1ae40 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c  +i, destNotNull,
1ae50 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
1ae60 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
1ae70 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
1ae80 53 45 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  SEQ);.    VdbeCo
1ae90 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1aea0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1aeb0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
1aec0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1aed0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1aee0 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e  Goto, 0, destIfN
1aef0 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63  ull);.  if( nVec
1af00 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  tor>1 ){.    sql
1af10 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1af20 61 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e  abel(v, destNotN
1af30 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1af40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1af50 50 5f 4e 65 78 74 2c 20 70 45 78 70 72 2d 3e 69  P_Next, pExpr->i
1af60 54 61 62 6c 65 2c 20 61 64 64 72 54 6f 70 2b 31  Table, addrTop+1
1af70 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1af80 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  age(v);..    /* 
1af90 53 74 65 70 20 37 3a 20 20 49 66 20 77 65 20 72  Step 7:  If we r
1afa0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1afb0 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
1afc0 65 20 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20  e result must.  
1afd0 20 20 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a    ** be false. *
1afe0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
1aff0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1b000 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c  to, 0, destIfFal
1b010 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  se);.  }..  /* J
1b020 75 6d 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64  umps here in ord
1b030 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75  er to return tru
1b040 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  e. */.  sqlite3V
1b050 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1b060 64 64 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71  ddrTruthOp);..sq
1b070 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
1b080 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20  finished:.  if( 
1b090 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29  rLhs!=rLhsOrig )
1b0a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1b0b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1b0c0 4c 68 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Lhs);.  sqlite3E
1b0d0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1b0e0 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  se);.  VdbeComme
1b0f0 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65  nt((v, "end IN e
1b100 78 70 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45  xpr"));.sqlite3E
1b110 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72  xprCodeIN_oom_er
1b120 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  ror:.  sqlite3Db
1b130 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1b140 20 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74   aiMap);.  sqlit
1b150 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1b160 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65  >db, zAff);.}.#e
1b170 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1b180 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
1b190 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b1a0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1b1b0 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  INT./*.** Genera
1b1c0 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
1b1d0 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
1b1e0 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  the floating poi
1b1f0 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63  nt.** value desc
1b200 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d  ribed by z[0..n-
1b210 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
1b220 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iMem..**.** The
1b230 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c   z[] string will
1b240 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65   probably not be
1b250 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
1b260 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a  .  But the .** z
1b270 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73  [n] character is
1b280 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1b290 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  e something that
1b2a0 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a   does not look.*
1b2b0 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69  * like the conti
1b2c0 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  nuation of the n
1b2d0 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
1b2e0 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56   void codeReal(V
1b2f0 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
1b300 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74  ar *z, int negat
1b310 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  eFlag, int iMem)
1b320 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a  {.  if( ALWAYS(z
1b330 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  !=0) ){.    doub
1b340 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71  le value;.    sq
1b350 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61  lite3AtoF(z, &va
1b360 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  lue, sqlite3Strl
1b370 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f  en30(z), SQLITE_
1b380 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72  UTF8);.    asser
1b390 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e  t( !sqlite3IsNaN
1b3a0 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68  (value) ); /* Th
1b3b0 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72  e new AtoF never
1b3c0 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a   returns NaN */.
1b3d0 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c      if( negateFl
1b3e0 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61  ag ) value = -va
1b3f0 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  lue;.    sqlite3
1b400 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
1b410 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d  , OP_Real, 0, iM
1b420 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
1b430 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20  ue, P4_REAL);.  
1b440 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
1b450 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
1b460 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
1b470 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74  will put the int
1b480 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79  eger describe by
1b490 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d  .** text z[0..n-
1b4a0 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
1b4b0 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70   iMem..**.** Exp
1b4c0 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c  r.u.zToken is al
1b4d0 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65  ways UTF8 and ze
1b4e0 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a  ro-terminated..*
1b4f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
1b500 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20  deInteger(Parse 
1b510 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1b520 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61  Expr, int negFla
1b530 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
1b540 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1b550 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70  ->pVdbe;.  if( p
1b560 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1b570 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
1b580 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e   int i = pExpr->
1b590 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73  u.iValue;.    as
1b5a0 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20  sert( i>=0 );.  
1b5b0 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
1b5c0 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69  i = -i;.    sqli
1b5d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b5e0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
1b5f0 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iMem);.  }else{.
1b600 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69      int c;.    i
1b610 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f  64 value;.    co
1b620 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
1b630 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
1b640 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
1b650 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74  );.    c = sqlit
1b660 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
1b670 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
1b680 69 66 28 20 28 63 3d 3d 33 20 26 26 20 21 6e 65  if( (c==3 && !ne
1b690 67 46 6c 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29  gFlag) || (c==2)
1b6a0 20 7c 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20   || (negFlag && 
1b6b0 76 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f  value==SMALLEST_
1b6c0 49 4e 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20  INT64)){.#ifdef 
1b6d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1b6e0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
1b6f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1b700 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69  (pParse, "oversi
1b710 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25  zed integer: %s%
1b720 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d  s", negFlag ? "-
1b730 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73  " : "", z);.#els
1b740 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
1b750 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45  _OMIT_HEX_INTEGE
1b760 52 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  R.      if( sqli
1b770 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22  te3_strnicmp(z,"
1b780 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20  0x",2)==0 ){.   
1b790 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1b7a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68 65  rMsg(pParse, "he
1b7b0 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69  x literal too bi
1b7c0 67 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61  g: %s%s", negFla
1b7d0 67 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20  g?"-":"",z);.   
1b7e0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
1b7f0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1b800 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e  codeReal(v, z, n
1b810 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20  egFlag, iMem);. 
1b820 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1b830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1b840 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61  f( negFlag ){ va
1b850 6c 75 65 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41  lue = c==3 ? SMA
1b860 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76  LLEST_INT64 : -v
1b870 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71  alue; }.      sq
1b880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
1b890 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c  up8(v, OP_Int64,
1b8a0 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38   0, iMem, 0, (u8
1b8b0 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54  *)&value, P4_INT
1b8c0 36 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  64);.    }.  }.}
1b8d0 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 63 6f  ../*.** Erase co
1b8e0 6c 75 6d 6e 2d 63 61 63 68 65 20 65 6e 74 72 79  lumn-cache entry
1b8f0 20 6e 75 6d 62 65 72 20 69 0a 2a 2f 0a 73 74 61   number i.*/.sta
1b900 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e  tic void cacheEn
1b910 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a  tryClear(Parse *
1b920 70 50 61 72 73 65 2c 20 69 6e 74 20 69 29 7b 0a  pParse, int i){.
1b930 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
1b940 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52  olCache[i].tempR
1b950 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  eg ){.    if( pP
1b960 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
1b970 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
1b980 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
1b990 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
1b9a0 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
1b9b0 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73  mpReg++] = pPars
1b9c0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
1b9d0 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iReg;.    }.  }.
1b9e0 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61    pParse->nColCa
1b9f0 63 68 65 2d 2d 3b 0a 20 20 69 66 28 20 69 3c 70  che--;.  if( i<p
1ba00 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1ba10 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1ba20 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70  aColCache[i] = p
1ba30 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1ba40 5b 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  [pParse->nColCac
1ba50 68 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  he];.  }.}.../*.
1ba60 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  ** Record in the
1ba70 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68   column cache th
1ba80 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  at a particular 
1ba90 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a  column from a.**
1baa0 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
1bab0 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
1bac0 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
1bad0 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ster..*/.void sq
1bae0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1baf0 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ore(Parse *pPars
1bb00 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74  e, int iTab, int
1bb10 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29   iCol, int iReg)
1bb20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1bb30 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69   minLru;.  int i
1bb40 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20  dxLru;.  struct 
1bb50 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
1bb60 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72   /* Unless an er
1bb70 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
1bb80 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  , register numbe
1bb90 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f  rs are always po
1bba0 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73  sitive. */.  ass
1bbb0 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70  ert( iReg>0 || p
1bbc0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
1bbd0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1bbe0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73  cFailed );.  ass
1bbf0 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26  ert( iCol>=-1 &&
1bc00 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20   iCol<32768 );  
1bc10 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e  /* Finite column
1bc20 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f   numbers */..  /
1bc30 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c  * The SQLITE_Col
1bc40 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69  umnCache flag di
1bc50 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d  sables the colum
1bc60 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69  n cache.  This i
1bc70 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20  s used.  ** for 
1bc80 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74  testing only - t
1bc90 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51  o verify that SQ
1bca0 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73  Lite always gets
1bcb0 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
1bcc0 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77  .  ** with and w
1bcd0 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  ithout the colum
1bce0 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  n cache..  */.  
1bcf0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
1bd00 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d  Disabled(pParse-
1bd10 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75  >db, SQLITE_Colu
1bd20 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72  mnCache) ) retur
1bd30 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72  n;..  /* First r
1bd40 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
1bd50 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a  ing entry..  **.
1bd60 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
1bd70 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d  he way the colum
1bd80 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65  n cache is curre
1bd90 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72  ntly used, we ar
1bda0 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a  e guaranteed.  *
1bdb0 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63  * that the objec
1bdc0 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72  t will never alr
1bdd0 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65  eady be in cache
1bde0 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67  .  Verify this g
1bdf0 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23  uarantee..  */.#
1be00 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1be10 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1be20 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1be30 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1be40 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
1be50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
1be60 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e  ble!=iTab || p->
1be70 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b  iColumn!=iCol );
1be80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1be90 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69  * If the cache i
1bea0 73 20 61 6c 72 65 61 64 79 20 66 75 6c 6c 2c 20  s already full, 
1beb0 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61 73 74  delete the least
1bec0 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 65   recently used e
1bed0 6e 74 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 50  ntry */.  if( pP
1bee0 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3e  arse->nColCache>
1bef0 3d 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  =SQLITE_N_COLCAC
1bf00 48 45 20 29 7b 0a 20 20 20 20 6d 69 6e 4c 72 75  HE ){.    minLru
1bf10 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   = 0x7fffffff;. 
1bf20 20 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a     idxLru = -1;.
1bf30 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70      for(i=0, p=p
1bf40 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1bf50 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
1bf60 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
1bf70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6c  {.      if( p->l
1bf80 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20  ru<minLru ){.   
1bf90 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b       idxLru = i;
1bfa0 0a 20 20 20 20 20 20 20 20 6d 69 6e 4c 72 75 20  .        minLru 
1bfb0 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 20 20  = p->lru;.      
1bfc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  }.    }.    p = 
1bfd0 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
1bfe0 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 7d 65  he[idxLru];.  }e
1bff0 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 26 70 50  lse{.    p = &pP
1c000 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1c010 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1c020 65 2b 2b 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e++];.  }..  /* 
1c030 41 64 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72  Add the new entr
1c040 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  y to the end of 
1c050 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 70  the cache */.  p
1c060 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
1c070 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
1c080 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
1c090 61 62 3b 0a 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e  ab;.  p->iColumn
1c0a0 20 3d 20 69 43 6f 6c 3b 0a 20 20 70 2d 3e 69 52   = iCol;.  p->iR
1c0b0 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 2d 3e  eg = iReg;.  p->
1c0c0 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70  tempReg = 0;.  p
1c0d0 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
1c0e0 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 7d 0a 0a  iCacheCnt++;.}..
1c0f0 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
1c100 68 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65  hat registers be
1c110 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67  tween iReg..iReg
1c120 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e  +nReg-1 are bein
1c130 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a  g overwritten..*
1c140 2a 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67  * Purge the rang
1c150 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66  e of registers f
1c160 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
1c170 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ache..*/.void sq
1c180 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1c190 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  move(Parse *pPar
1c1a0 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
1c1b0 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
1c1c0 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
1c1d0 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1c1e0 68 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  he ){.    struct
1c1f0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 20 3d 20   yColCache *p = 
1c200 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
1c210 68 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  he[i];.    if( p
1c220 2d 3e 69 52 65 67 20 3e 3d 20 69 52 65 67 20 26  ->iReg >= iReg &
1c230 26 20 70 2d 3e 69 52 65 67 20 3c 20 69 52 65 67  & p->iReg < iReg
1c240 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63  +nReg ){.      c
1c250 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
1c260 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d  Parse, i);.    }
1c270 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  else{.      i++;
1c280 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1c290 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65  .** Remember the
1c2a0 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20   current column 
1c2b0 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20  cache context.  
1c2c0 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20  Any new entries 
1c2d0 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74  added.** added t
1c2e0 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  o the column cac
1c2f0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61  he after this ca
1c300 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77  ll are removed w
1c310 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  hen the.** corre
1c320 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63  sponding pop occ
1c330 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
1c340 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1c350 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  h(Parse *pParse)
1c360 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  {.  pParse->iCac
1c370 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65  heLevel++;.#ifde
1c380 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1c390 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
1c3a0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1c3b0 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
1c3c0 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 55  {.    printf("PU
1c3d0 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61  SH to %d\n", pPa
1c3e0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1c3f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
1c400 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72  ./*.** Remove fr
1c410 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
1c420 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  che any entries 
1c430 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20  that were added 
1c440 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65  since the.** the
1c450 20 70 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65   previous sqlite
1c460 33 45 78 70 72 43 61 63 68 65 50 75 73 68 20 6f  3ExprCachePush o
1c470 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74  peration.  In ot
1c480 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f  her words, resto
1c490 72 65 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  re.** the cache 
1c4a0 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20  to the state it 
1c4b0 77 61 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65  was in prior the
1c4c0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73   most recent Pus
1c4d0 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
1c4e0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 50  e3ExprCachePop(P
1c4f0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1c500 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 61 73   int i = 0;.  as
1c510 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43  sert( pParse->iC
1c520 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a  acheLevel>=1 );.
1c530 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
1c540 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20  Level--;.#ifdef 
1c550 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
1c560 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
1c570 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
1c580 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
1c590 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20      printf("POP 
1c5a0 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73   to %d\n", pPars
1c5b0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b  e->iCacheLevel);
1c5c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68  .  }.#endif.  wh
1c5d0 69 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e  ile( i<pParse->n
1c5e0 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ColCache ){.    
1c5f0 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  if( pParse->aCol
1c600 43 61 63 68 65 5b 69 5d 2e 69 4c 65 76 65 6c 3e  Cache[i].iLevel>
1c610 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c620 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  vel ){.      cac
1c630 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
1c640 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c  rse, i);.    }el
1c650 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20  se{.      i++;. 
1c660 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1c670 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65 64 20  * When a cached 
1c680 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64  column is reused
1c690 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
1c6a0 20 69 74 73 20 72 65 67 69 73 74 65 72 20 69 73   its register is
1c6b0 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76  .** no longer av
1c6c0 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d  ailable as a tem
1c6d0 70 20 72 65 67 69 73 74 65 72 2e 20 20 74 69 63  p register.  tic
1c6e0 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68 61 74  ket #3879:  that
1c6f0 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65   same.** registe
1c700 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68  r might be in th
1c710 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69  e cache in multi
1c720 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62  ple places, so b
1c730 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74  e sure to.** get
1c740 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74   them all..*/.st
1c750 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
1c760 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
1c770 69 73 74 65 72 28 50 61 72 73 65 20 2a 70 50 61  ister(Parse *pPa
1c780 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
1c790 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1c7a0 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
1c7b0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
1c7c0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
1c7d0 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1c7e0 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  che; i++, p++){.
1c7f0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d      if( p->iReg=
1c800 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70  =iReg ){.      p
1c810 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
1c820 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47     }.  }.}../* G
1c830 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1c840 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f  t will load into
1c850 20 72 65 67 69 73 74 65 72 20 72 65 67 4f 75 74   register regOut
1c860 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 73   a value that is
1c870 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
1c880 66 6f 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d  for the iIdxCol-
1c890 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  th column of ind
1c8a0 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64  ex pIdx..*/.void
1c8b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c8c0 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28  LoadIndexColumn(
1c8d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c8e0 2c 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e  ,  /* The parsin
1c8f0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
1c900 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f  ndex *pIdx,    /
1c910 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73  * The index whos
1c920 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62  e column is to b
1c930 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e  e loaded */.  in
1c940 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
1c950 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
1c960 20 74 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20   to a table row 
1c970 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c  */.  int iIdxCol
1c980 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75  ,    /* The colu
1c990 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  mn of the index 
1c9a0 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a  to be loaded */.
1c9b0 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20    int regOut    
1c9c0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69    /* Store the i
1c9d0 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ndex column valu
1c9e0 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  e in this regist
1c9f0 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69  er */.){.  i16 i
1ca00 54 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61  TabCol = pIdx->a
1ca10 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d  iColumn[iIdxCol]
1ca20 3b 0a 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d  ;.  if( iTabCol=
1ca30 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20  =XN_EXPR ){.    
1ca40 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43  assert( pIdx->aC
1ca50 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73  olExpr );.    as
1ca60 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c  sert( pIdx->aCol
1ca70 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78  Expr->nExpr>iIdx
1ca80 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73  Col );.    pPars
1ca90 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54  e->iSelfTab = iT
1caa0 61 62 43 75 72 20 2b 20 31 3b 0a 20 20 20 20 73  abCur + 1;.    s
1cab0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
1cac0 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  py(pParse, pIdx-
1cad0 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64  >aColExpr->a[iId
1cae0 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67  xCol].pExpr, reg
1caf0 4f 75 74 29 3b 0a 20 20 20 20 70 50 61 72 73 65  Out);.    pParse
1cb00 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a  ->iSelfTab = 0;.
1cb10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1cb20 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1cb30 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61  olumnOfTable(pPa
1cb40 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78  rse->pVdbe, pIdx
1cb50 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75  ->pTable, iTabCu
1cb60 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb80 20 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20         iTabCol, 
1cb90 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  regOut);.  }.}..
1cba0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1cbb0 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74  ode to extract t
1cbc0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1cbd0 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
1cbe0 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  f a table..*/.vo
1cbf0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1cc00 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1cc10 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  le(.  Vdbe *v,  
1cc20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1cc30 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
1cc40 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  tion */.  Table 
1cc50 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65  *pTab,    /* The
1cc60 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1cc70 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20  g the value */. 
1cc80 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
1cc90 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75   /* The table cu
1cca0 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b  rsor.  Or the PK
1ccb0 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48   cursor for WITH
1ccc0 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69  OUT ROWID */.  i
1ccd0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f  nt iCol,       /
1cce0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
1ccf0 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
1cd00 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
1cd10 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
1cd20 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20   the value into 
1cd30 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1cd40 0a 29 7b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  .){.  if( pTab==
1cd50 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1cd60 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1cd70 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72  _Column, iTabCur
1cd80 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  , iCol, regOut);
1cd90 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1cda0 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c  .  if( iCol<0 ||
1cdb0 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
1cdc0 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
1cdd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cde0 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72  P_Rowid, iTabCur
1cdf0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
1ce00 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d  se{.    int op =
1ce10 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1ce20 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20   ? OP_VColumn : 
1ce30 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  OP_Column;.    i
1ce40 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  nt x = iCol;.   
1ce50 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
1ce60 54 61 62 29 20 26 26 20 21 49 73 56 69 72 74 75  Tab) && !IsVirtu
1ce70 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
1ce80 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c    x = sqlite3Col
1ce90 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74  umnOfIndex(sqlit
1cea0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
1ceb0 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a  x(pTab), iCol);.
1cec0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1ced0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1cee0 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72  p, iTabCur, x, r
1cef0 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66  egOut);.  }.  if
1cf00 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
1cf10 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
1cf20 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
1cf30 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1cf40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1cf50 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1cf60 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69  ll extract the i
1cf70 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e  Column-th column
1cf80 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70   from.** table p
1cf90 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68  Tab and store th
1cfa0 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1cfb0 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a  n a register. .*
1cfc0 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69  *.** An effort i
1cfd0 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
1cfe0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
1cff0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1d000 67 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e  g.  This.** is n
1d010 6f 74 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f  ot garanteeed fo
1d020 72 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20  r GetColumn() - 
1d030 74 68 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62  the result can b
1d040 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61  e stored in.** a
1d050 6e 79 20 72 65 67 69 73 74 65 72 2e 20 20 42 75  ny register.  Bu
1d060 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  t the result is 
1d070 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61  guaranteed to la
1d080 6e 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  nd in register i
1d090 52 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f  Reg.** for GetCo
1d0a0 6c 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a  lumnToReg()..**.
1d0b0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
1d0c0 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
1d0d0 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c  to pTab in iTabl
1d0e0 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
1d0f0 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
1d100 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20  .  If iColumn<0 
1d110 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
1d120 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72  erated that extr
1d130 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  acts the rowid..
1d140 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1d150 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1d160 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1d170 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
1d180 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1d190 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1d1a0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1d1b0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1d1c0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
1d1d0 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
1d1e0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
1d1f0 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
1d200 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1d210 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
1d220 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
1d230 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
1d240 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
1d250 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
1d260 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
1d270 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75  ults here */.  u
1d280 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20  8 p5            
1d290 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20  /* P5 value for 
1d2a0 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47  OP_Column + FLAG
1d2b0 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  S */.){.  Vdbe *
1d2c0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1d2d0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1d2e0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1d2f0 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
1d300 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1d310 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
1d320 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
1d330 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
1d340 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
1d350 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f   p->iColumn==iCo
1d360 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d  lumn ){.      p-
1d370 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
1d380 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
1d390 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1d3a0 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 70 50  hePinRegister(pP
1d3b0 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a  arse, p->iReg);.
1d3c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e        return p->
1d3d0 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  iReg;.    }.  } 
1d3e0 20 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30   .  assert( v!=0
1d3f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1d400 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
1d410 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69  Table(v, pTab, i
1d420 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
1d430 69 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20  iReg);.  if( p5 
1d440 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1d450 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35  beChangeP5(v, p5
1d460 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20  );.  }else{   . 
1d470 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1d480 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1d490 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
1d4a0 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72  , iReg);.  }.  r
1d4b0 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f  eturn iReg;.}.vo
1d4c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1d4d0 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67  deGetColumnToReg
1d4e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1d4f0 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
1d500 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1d510 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d520 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
1d530 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1d540 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
1d550 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f   are reading fro
1d560 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  m */.  int iColu
1d570 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  mn,     /* Index
1d580 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
1d590 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  lumn */.  int iT
1d5a0 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  able,      /* Th
1d5b0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
1d5c0 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  g to the table *
1d5d0 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20  /.  int iReg    
1d5e0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65       /* Store re
1d5f0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
1d600 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69  .  int r1 = sqli
1d610 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1d620 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61  lumn(pParse, pTa
1d630 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62  b, iColumn, iTab
1d640 6c 65 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20 20  le, iReg, 0);.  
1d650 69 66 28 20 72 31 21 3d 69 52 65 67 20 29 20 73  if( r1!=iReg ) s
1d660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d670 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1d680 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69 52  OP_SCopy, r1, iR
1d690 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  eg);.}.../*.** C
1d6a0 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20  lear all column 
1d6b0 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a  cache entries..*
1d6c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1d6d0 70 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72  prCacheClear(Par
1d6e0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
1d6f0 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51  nt i;..#ifdef SQ
1d700 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1d710 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1d720 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
1d730 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
1d740 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c    printf("CLEAR\
1d750 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n");.  }.#endif.
1d760 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
1d770 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
1d780 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
1d790 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1d7a0 69 5d 2e 74 65 6d 70 52 65 67 0a 20 20 20 20 20  i].tempReg.     
1d7b0 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
1d7c0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
1d7d0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 0a  arse->aTempReg).
1d7e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 70 50      ){.       pP
1d7f0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
1d800 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
1d810 2b 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  +] = pParse->aCo
1d820 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a  lCache[i].iReg;.
1d830 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
1d840 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20  se->nColCache = 
1d850 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  0;.}../*.** Reco
1d860 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
1d870 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61   an affinity cha
1d880 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  nge has occurred
1d890 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65   on iCount.** re
1d8a0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
1d8b0 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f   with iStart..*/
1d8c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1d8d0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1d8e0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
1d8f0 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20  se, int iStart, 
1d900 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73  int iCount){.  s
1d910 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
1d920 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53  emove(pParse, iS
1d930 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d  tart, iCount);.}
1d940 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1d950 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f   code to move co
1d960 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73  ntent from regis
1d970 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72  ters iFrom...iFr
1d980 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65  om+nReg-1.** ove
1d990 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52  r to iTo..iTo+nR
1d9a0 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63  eg-1. Keep the c
1d9b0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74  olumn cache up-t
1d9c0 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  o-date..*/.void 
1d9d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
1d9e0 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
1d9f0 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
1da00 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29  t iTo, int nReg)
1da10 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f  {.  assert( iFro
1da20 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69  m>=iTo+nReg || i
1da30 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29  From+nReg<=iTo )
1da40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1da50 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56  ddOp3(pParse->pV
1da60 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46  dbe, OP_Move, iF
1da70 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b  rom, iTo, nReg);
1da80 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1da90 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1daa0 2c 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a  , iFrom, nReg);.
1dab0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
1dac0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1dad0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
1dae0 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a  OVERAGE_TEST)./*
1daf0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1db00 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20  if any register 
1db10 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72  in the range iFr
1db20 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69  om..iTo (inclusi
1db30 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61  ve).** is used a
1db40 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  s part of the co
1db50 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  lumn cache..**.*
1db60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1db70 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 73  s used within as
1db80 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63  sert() and testc
1db90 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c  ase() macros onl
1dba0 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f  y.** and does no
1dbb0 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f  t appear in a no
1dbc0 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  rmal build..*/.s
1dbd0 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73  tatic int usedAs
1dbe0 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73  ColumnCache(Pars
1dbf0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1dc00 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
1dc10 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1dc20 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
1dc30 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
1dc40 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
1dc50 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1dc60 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  che; i++, p++){.
1dc70 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69      int r = p->i
1dc80 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
1dc90 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20  iFrom && r<=iTo 
1dca0 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f  ) return 1;    /
1dcb0 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20  *NO_TEST*/.  }. 
1dcc0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1dcd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
1dce0 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f  BUG || SQLITE_CO
1dcf0 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a  VERAGE_TEST */..
1dd00 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1dd10 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
1dd20 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f  on node to a TK_
1dd30 52 45 47 49 53 54 45 52 20 72 65 66 65 72 65 6e  REGISTER referen
1dd40 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72  cing.** register
1dd50 20 69 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c   iReg.  The call
1dd60 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
1dd70 68 61 74 20 69 52 65 67 20 61 6c 72 65 61 64 79  hat iReg already
1dd80 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
1dd90 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
1dda0 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
1ddb0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1ddc0 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72  d exprToRegister
1ddd0 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52  (Expr *p, int iR
1dde0 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20  eg){.  p->op2 = 
1ddf0 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d  p->op;.  p->op =
1de00 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
1de10 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67  p->iTable = iReg
1de20 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f  ;.  ExprClearPro
1de30 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70  perty(p, EP_Skip
1de40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c  );.}../*.** Eval
1de50 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
1de60 6f 6e 20 28 65 69 74 68 65 72 20 61 20 76 65 63  on (either a vec
1de70 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 20  tor or a scalar 
1de80 65 78 70 72 65 73 73 69 6f 6e 29 20 61 6e 64 20  expression) and 
1de90 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65 73  store.** the res
1dea0 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f  ult in continguo
1deb0 75 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  us temporary reg
1dec0 69 73 74 65 72 73 2e 20 20 52 65 74 75 72 6e 20  isters.  Return 
1ded0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
1dee0 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
1def0 65 72 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  er used to store
1df00 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
1df10 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
1df20 65 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  ed result regist
1df30 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
1df40 79 20 73 63 61 6c 61 72 2c 20 74 68 65 6e 20 61  y scalar, then a
1df50 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74 68 61  lso write.** tha
1df60 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
1df70 72 20 69 6e 74 6f 20 2a 70 69 46 72 65 65 61 62  r into *piFreeab
1df80 6c 65 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  le.  If the retu
1df90 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69  rned result regi
1dfa0 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61  ster.** is not a
1dfb0 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 66   temporary or if
1dfc0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1dfd0 69 73 20 61 20 76 65 63 74 6f 72 20 73 65 74 20  is a vector set 
1dfe0 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74  *piFreeable.** t
1dff0 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  o 0..*/.static i
1e000 6e 74 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  nt exprCodeVecto
1e010 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1e020 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70   Expr *p, int *p
1e030 69 46 72 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e  iFreeable){.  in
1e040 74 20 69 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74  t iResult;.  int
1e050 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   nResult = sqlit
1e060 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
1e070 28 70 29 3b 0a 20 20 69 66 28 20 6e 52 65 73 75  (p);.  if( nResu
1e080 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 52 65  lt==1 ){.    iRe
1e090 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  sult = sqlite3Ex
1e0a0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e0b0 65 2c 20 70 2c 20 70 69 46 72 65 65 61 62 6c 65  e, p, piFreeable
1e0c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e0d0 2a 70 69 46 72 65 65 61 62 6c 65 20 3d 20 30 3b  *piFreeable = 0;
1e0e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
1e0f0 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 23 69 66  TK_SELECT ){.#if
1e100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1e110 51 55 45 52 59 0a 20 20 20 20 20 20 69 52 65 73  QUERY.      iRes
1e120 75 6c 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  ult = 0;.#else. 
1e130 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73       iResult = s
1e140 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
1e150 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 30  ect(pParse, p, 0
1e160 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
1e170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1e180 74 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75  t i;.      iResu
1e190 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  lt = pParse->nMe
1e1a0 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  m+1;.      pPars
1e1b0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
1e1c0 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  lt;.      for(i=
1e1d0 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b  0; i<nResult; i+
1e1e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
1e1f0 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
1e200 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d  rable(pParse, p-
1e210 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
1e220 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29  Expr, i+iResult)
1e230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e240 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
1e250 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  sult;.}.../*.** 
1e260 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
1e270 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
1e280 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
1e290 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
1e2a0 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70  ression.  Attemp
1e2b0 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  t to store the r
1e2c0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
1e2d0 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20  er "target"..** 
1e2e0 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
1e2f0 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74  ter where result
1e300 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  s are stored..**
1e310 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f  .** With this ro
1e320 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20  utine, there is 
1e330 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  no guarantee tha
1e340 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a  t results will.*
1e350 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  * be stored in t
1e360 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
1e370 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72  lt might be stor
1e380 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ed in some other
1e390 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20  .** register if 
1e3a0 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74  it is convenient
1e3b0 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20   to do so.  The 
1e3c0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1e3d0 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74  .** must check t
1e3e0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
1e3f0 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75  nd move the resu
1e400 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72  lts to the desir
1e410 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a  ed.** register..
1e420 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1e430 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72  prCodeTarget(Par
1e440 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1e450 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1e460 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
1e470 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1e480 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65    /* The VM unde
1e490 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1e4a0 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e4c0 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
1e4d0 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
1e4e0 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
1e4f0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1e500 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
1e510 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20  ster inReg */.  
1e520 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
1e530 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
1e540 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
1e550 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
1e560 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
1e570 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20  egFree2 = 0;    
1e580 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
1e590 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
1e5a0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1e5b0 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   */.  int r1, r2
1e5c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e5d0 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73  /* Various regis
1e5e0 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20  ter numbers */. 
1e5f0 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20   Expr tempX;    
1e600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1e610 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69  mporary expressi
1e620 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  on node */.  int
1e630 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65   p5 = 0;..  asse
1e640 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
1e650 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
1e660 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d  nMem );.  if( v=
1e670 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1e680 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
1e690 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1e6a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1e6b0 0a 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65  .expr_code_doove
1e6c0 72 3a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  r:.  if( pExpr==
1e6d0 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
1e6e0 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
1e6f0 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
1e700 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
1e710 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1e720 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
1e730 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1e740 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
1e750 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1e760 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1e770 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
1e780 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
1e790 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
1e7a0 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
1e7b0 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
1e7c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1e7d0 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
1e7e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
1e7f0 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
1e800 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
1e810 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
1e820 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
1e830 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1e840 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
1e850 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
1e860 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1e890 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
1e8a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1e8b0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
1e8c0 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
1e8d0 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
1e8e0 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
1e8f0 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
1e900 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1e910 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
1e920 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
1e930 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
1e940 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
1e950 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69     if( pParse->i
1e960 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a 20 20 20  SelfTab<0 ){.   
1e970 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
1e980 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74  ting CHECK const
1e990 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74  raints or insert
1e9a0 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c  ing into partial
1e9b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
1e9c0 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
1e9d0 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72  ->iColumn - pPar
1e9e0 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20  se->iSelfTab;.  
1e9f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ea00 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67         /* Coding
1ea10 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
1ea20 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
1ea30 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f  n index where co
1ea40 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20  lumn names.     
1ea50 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
1ea60 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20 74 68  ndex refer to th
1ea70 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68  e table to which
1ea80 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
1ea90 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  gs */.          
1eaa0 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69  iTab = pParse->i
1eab0 53 65 6c 66 54 61 62 20 2d 20 31 3b 0a 20 20 20  SelfTab - 1;.   
1eac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ead0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1eae0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1eaf0 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
1eb00 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20  pr->pTab,.      
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1eb30 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74  iColumn, iTab, t
1eb40 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
1eb70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
1eb80 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
1eb90 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
1eba0 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
1ebb0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1ebc0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1ebd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ebe0 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20 7b   TK_TRUEFALSE: {
1ebf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ec00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1ec10 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33 45  nteger, sqlite3E
1ec20 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45  xprTruthValue(pE
1ec30 78 70 72 29 2c 20 74 61 72 67 65 74 29 3b 0a 20  xpr), target);. 
1ec40 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1ec50 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  et;.    }.#ifnde
1ec60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1ec70 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1ec80 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
1ec90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1eca0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1ecb0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1ecc0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f  lue) );.      co
1ecd0 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d  deReal(v, pExpr-
1ece0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61  >u.zToken, 0, ta
1ecf0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1ed00 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1ed10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1ed20 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
1ed30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1ed40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ed50 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1ed60 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1ed70 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
1ed80 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70  (v, target, pExp
1ed90 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1eda0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1edb0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
1edc0 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
1edd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ede0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1edf0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1ee00 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1ee10 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1ee20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1ee30 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1ee40 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
1ee50 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1ee60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
1ee70 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
1ee80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ee90 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1eea0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1eeb0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1eec0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1eed0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
1eee0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1eef0 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
1ef00 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1ef10 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
1ef20 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
1ef30 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
1ef40 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
1ef50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1ef60 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
1ef70 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
1ef80 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
1ef90 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
1efa0 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
1efb0 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
1efc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1efd0 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
1efe0 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
1eff0 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
1f000 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f010 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
1f020 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
1f030 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
1f040 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1f050 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1f060 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1f070 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f080 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1f090 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1f0a0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1f0b0 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  oken[0]!=0 );.  
1f0c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f0d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69  ddOp2(v, OP_Vari
1f0e0 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
1f0f0 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
1f100 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1f110 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29  u.zToken[1]!=0 )
1f120 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1f130 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
1f140 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28  3VListNumToName(
1f150 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
1f160 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
1f170 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f180 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1f190 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63  [0]=='?' || strc
1f1a0 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
1f1b0 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20  en, z)==0 );.   
1f1c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c       pParse->pVL
1f1d0 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49  ist[0] = 0; /* I
1f1e0 6e 64 69 63 61 74 65 20 56 4c 69 73 74 20 6d 61  ndicate VList ma
1f1f0 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65  y no longer be e
1f200 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20 20 20  nlarged */.     
1f210 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
1f220 70 65 6e 64 50 34 28 76 2c 20 28 63 68 61 72 2a  pendP4(v, (char*
1f230 29 7a 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  )z, P4_STATIC);.
1f240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1f250 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1f260 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
1f270 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
1f280 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69   return pExpr->i
1f290 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66  Table;.    }.#if
1f2a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f2b0 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
1f2c0 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
1f2d0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
1f2e0 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
1f2f0 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
1f300 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65  n) */.      inRe
1f310 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1f320 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1f330 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f340 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
1f350 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
1f360 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f370 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f380 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
1f390 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f3a0 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
1f3b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1f3c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f3d0 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74  p2(v, OP_Cast, t
1f3e0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1f400 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
1f410 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
1f420 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74  en, 0));.      t
1f430 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
1f440 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
1f450 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
1f460 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f470 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1f480 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1f490 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20   inReg, 1);.    
1f4a0 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
1f4b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1f4c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1f4d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1f4e0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1f4f0 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20  ISNOT:.      op 
1f500 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
1f510 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
1f520 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45       p5 = SQLITE
1f530 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
1f540 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a  * fall-through *
1f550 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
1f560 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1f570 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1f580 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1f590 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1f5a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1f5b0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
1f5c0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
1f5d0 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Left;.      if( 
1f5e0 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
1f5f0 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20  tor(pLeft) ){.  
1f600 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72        codeVector
1f610 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1f620 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f  pExpr, target, o
1f630 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65  p, p5);.      }e
1f640 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
1f650 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f660 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
1f670 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f680 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
1f690 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f6a0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f6b0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1f6c0 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  e2);.        cod
1f6d0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1f6e0 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70   pLeft, pExpr->p
1f6f0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1f700 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
1f710 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
1f720 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20  REP2 | p5);.    
1f730 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
1f740 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
1f750 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
1f760 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f770 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
1f780 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
1f790 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
1f7a0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
1f7b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f7c0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
1f7d0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
1f7e0 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
1f7f0 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
1f800 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f810 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
1f820 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
1f830 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
1f840 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
1f850 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f860 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
1f870 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1f880 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1f890 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1f8a0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f8b0 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1f8c0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
1f8d0 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
1f8e0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
1f8f0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f900 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
1f910 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f920 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1f930 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f940 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1f950 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1f960 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f970 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
1f980 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
1f990 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
1f9a0 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
1f9b0 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
1f9c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
1f9d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
1f9e0 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
1f9f0 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
1fa00 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
1fa10 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
1fa20 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
1fa30 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
1fa40 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
1fa50 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
1fa60 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20  =OP_And );      
1fa70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fa80 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20  op==TK_AND );.  
1fa90 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
1faa0 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20  R==OP_Or );     
1fab0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1fac0 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  e( op==TK_OR );.
1fad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1fae0 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
1faf0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1fb00 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53  ase( op==TK_PLUS
1fb10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1fb20 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
1fb30 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74  ubtract );     t
1fb40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fb50 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61  MINUS );.      a
1fb60 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
1fb70 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20  P_Remainder );  
1fb80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1fb90 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
1fba0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1fbb0 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
1fbc0 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1fbd0 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
1fbe0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fbf0 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
1fc00 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73  Or );        tes
1fc10 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1fc20 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  TOR );.      ass
1fc30 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
1fc40 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20  P_Divide );     
1fc50 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fc60 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20  TK_SLASH );.    
1fc70 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
1fc80 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
1fc90 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  t );   testcase(
1fca0 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29   op==TK_LSHIFT )
1fcb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fcc0 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
1fcd0 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73  iftRight );  tes
1fce0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53  tcase( op==TK_RS
1fcf0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
1fd00 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
1fd10 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20  =OP_Concat );   
1fd20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1fd30 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20  =TK_CONCAT );.  
1fd40 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1fd50 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1fd60 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1fd70 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1fd80 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1fd90 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1fda0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1fdb0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1fdc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1fdd0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
1fde0 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1fdf0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fe00 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1fe10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fe20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1fe30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fe40 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
1fe50 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
1fe60 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
1fe70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
1fe80 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
1fe90 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
1fea0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
1feb0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1fec0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
1fed0 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74  pLeft, 1, target
1fee0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1fef0 6e 20 74 61 72 67 65 74 3b 0a 23 69 66 6e 64 65  n target;.#ifnde
1ff00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1ff10 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1ff20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
1ff30 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
1ff40 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1ff50 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1ff60 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1ff70 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1ff80 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1ff90 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pLeft->u.zToken,
1ffa0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1ffb0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1ffc0 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  et;.#endif.     
1ffd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ffe0 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e  tempX.op = TK_IN
1fff0 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74  TEGER;.        t
20000 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f  empX.flags = EP_
20010 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65  IntValue|EP_Toke
20020 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74  nOnly;.        t
20030 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20  empX.u.iValue = 
20040 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  0;.        r1 = 
20050 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20060 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d  emp(pParse, &tem
20070 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pX, &regFree1);.
20080 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
20090 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
200a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
200b0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32  pLeft, &regFree2
200c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
200d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
200e0 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c  OP_Subtract, r2,
200f0 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
20100 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20110 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
20120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
20130 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20140 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
20150 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
20160 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
20170 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
20180 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  Not );   testcas
20190 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54  e( op==TK_BITNOT
201a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
201b0 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
201c0 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74   );         test
201d0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
201e0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
201f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
20200 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
20210 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
20220 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
20230 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
20240 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
20250 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
20260 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
20270 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20280 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
20290 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
202a0 20 69 73 54 72 75 65 3b 20 20 20 20 2f 2a 20 49   isTrue;    /* I
202b0 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  S TRUE or IS NOT
202c0 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 69   TRUE */.      i
202d0 6e 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a  nt bNormal;   /*
202e0 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 46   IS TRUE or IS F
202f0 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 72 31  ALSE */.      r1
20300 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20310 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
20320 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
20330 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
20340 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20350 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73  1==0 );.      is
20360 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78  True = sqlite3Ex
20370 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78  prTruthValue(pEx
20380 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
20390 20 20 20 62 4e 6f 72 6d 61 6c 20 3d 20 70 45 78     bNormal = pEx
203a0 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 3b 0a  pr->op2==TK_IS;.
203b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
203c0 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61  isTrue && bNorma
203d0 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
203e0 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20 62  se( !isTrue && b
203f0 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 73  Normal);.      s
20400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20410 49 6e 74 28 76 2c 20 4f 50 5f 49 73 54 72 75 65  Int(v, OP_IsTrue
20420 2c 20 72 31 2c 20 69 6e 52 65 67 2c 20 21 69 73  , r1, inReg, !is
20430 54 72 75 65 2c 20 69 73 54 72 75 65 20 5e 20 62  True, isTrue ^ b
20440 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 62  Normal);.      b
20450 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
20460 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
20470 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
20480 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
20490 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73   addr;.      ass
204a0 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
204b0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
204c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
204d0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
204e0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
204f0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
20500 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
20510 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
20520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20530 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
20540 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
20550 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
20560 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
20570 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20580 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
20590 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
205a0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
205b0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
205c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
205d0 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
205e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
205f0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
20600 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
20610 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
20620 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
20630 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20640 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
20650 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  er, 0, target);.
20660 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20670 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
20680 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
20690 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
206a0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
206b0 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
206c0 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d   *pInfo = pExpr-
206d0 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
206e0 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
206f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20700 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
20710 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
20720 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
20730 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20740 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
20750 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
20760 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  s()", pExpr->u.z
20770 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
20780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
20790 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  urn pInfo->aFunc
207a0 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
207b0 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
207c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
207d0 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
207e0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
207f0 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
20800 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
20810 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
20820 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
20830 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  Farg;           
20840 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
20850 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
20860 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  s */.      FuncD
20870 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20  ef *pDef;       
20880 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
20890 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a  n definition obj
208a0 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ect */.      con
208b0 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
208c0 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
208d0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
208e0 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20    u32 constMask 
208f0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b  = 0;     /* Mask
20900 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
20910 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  uments that are 
20920 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20  constant */.    
20930 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
20940 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
20950 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
20960 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20970 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
20980 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
20990 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  nection */.     
209a0 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
209b0 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  );      /* The t
209c0 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65  ext encoding use
209d0 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  d by this databa
209e0 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c  se */.      Coll
209f0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20  Seq *pColl = 0; 
20a00 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e     /* A collatin
20a10 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
20a20 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
20a30 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
20a40 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
20a50 5f 52 65 64 75 63 65 64 29 20 26 26 20 70 45 78  _Reduced) && pEx
20a60 70 72 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20  pr->pWin ){.    
20a70 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
20a80 2d 3e 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  ->pWin->regResul
20a90 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
20aa0 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f    if( ConstFacto
20ab0 72 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20 73  rOk(pParse) && s
20ac0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
20ad0 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
20ae0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
20af0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63   SQL functions c
20b00 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e  an be expensive.
20b10 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20   So try to move 
20b20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f  constant functio
20b30 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  ns.        ** ou
20b40 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  t of the inner l
20b50 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61  oop, even if tha
20b60 74 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61  t means an extra
20b70 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20   OP_Copy. */.   
20b80 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
20b90 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
20ba0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
20bb0 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -1);.      }.  
20bc0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
20bd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20be0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
20bf0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  ) );.      if( E
20c00 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20c10 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
20c20 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
20c30 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
20c40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
20c50 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
20c60 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
20c70 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61       nFarg = pFa
20c80 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70  rg ? pFarg->nExp
20c90 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73  r : 0;.      ass
20ca0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20cb0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
20cc0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
20cd0 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
20ce0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
20cf0 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
20d00 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
20d10 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  Id, nFarg, enc, 
20d20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0);.#ifdef SQLIT
20d30 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e  E_ENABLE_UNKNOWN
20d40 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20  _SQL_FUNCTION.  
20d50 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
20d60 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  && pParse->expla
20d70 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  in ){.        pD
20d80 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
20d90 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e  Function(db, "un
20da0 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65  known", nFarg, e
20db0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nc, 0);.      }.
20dc0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
20dd0 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66   pDef==0 || pDef
20de0 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29  ->xFinalize!=0 )
20df0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20e00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20e10 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74  , "unknown funct
20e20 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29  ion: %s()", zId)
20e30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
20e40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
20e50 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72  /* Attempt a dir
20e60 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ect implementati
20e70 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  on of the built-
20e80 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e  in COALESCE() an
20e90 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c  d.      ** IFNUL
20ea0 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  L() functions.  
20eb0 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65  This avoids unne
20ec0 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69  cessary evaluati
20ed0 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  on of.      ** a
20ee0 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68  rguments past th
20ef0 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c  e first non-NULL
20f00 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
20f10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
20f20 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20f30 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
20f40 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ESCE ){.        
20f50 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20  int endCoalesce 
20f60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
20f70 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
20f80 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
20f90 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  >=2 );.        s
20fa0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
20fb0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
20fc0 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
20fd0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
20fe0 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =1; i<nFarg; i++
20ff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
21000 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21010 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61  , OP_NotNull, ta
21020 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63  rget, endCoalesc
21030 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  e);.          Vd
21040 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
21050 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21060 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
21070 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20  pParse, target, 
21080 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
21090 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
210a0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
210b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
210c0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
210d0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
210e0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
210f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21100 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
21110 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
21130 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
21140 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
21150 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21160 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   }..      /* The
21170 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63   UNLIKELY() func
21180 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
21190 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20    The result is 
211a0 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
211b0 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
211c0 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
211d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
211e0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
211f0 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b  QLITE_FUNC_UNLIK
21200 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ELY ){.        a
21210 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20  ssert( nFarg>=1 
21220 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
21230 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
21240 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
21250 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
21260 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
21270 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
21280 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f  TE_DEBUG.      /
21290 2a 20 54 68 65 20 41 46 46 49 4e 49 54 59 28 29  * The AFFINITY()
212a0 20 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61   function evalua
212b0 74 65 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20  tes to a string 
212c0 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 20  that describes. 
212d0 20 20 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65       ** the type
212e0 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
212f0 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73   argument.  This
21300 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
21310 74 69 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a  ting of.      **
21320 20 74 68 65 20 53 51 4c 69 74 65 20 74 79 70 65   the SQLite type
21330 20 6c 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f   logic..      */
21340 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
21350 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
21360 49 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54  ITE_FUNC_AFFINIT
21370 59 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  Y ){.        con
21380 73 74 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d  st char *azAff[]
21390 20 3d 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65   = { "blob", "te
213a0 78 74 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20  xt", "numeric", 
213b0 22 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c  "integer", "real
213c0 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  " };.        cha
213d0 72 20 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61  r aff;.        a
213e0 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20  ssert( nFarg==1 
213f0 29 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d  );.        aff =
21400 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
21410 6e 69 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d  nity(pFarg->a[0]
21420 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
21430 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
21440 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74  String(v, target
21450 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 20 61 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66   aff ? azAff[aff
21480 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
21490 5d 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20  ] : "none");.   
214a0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
214b0 65 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  et;.      }.#end
214c0 69 66 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  if..      for(i=
214d0 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  0; i<nFarg; i++)
214e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
214f0 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  32 && sqlite3Exp
21500 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72  rIsConstant(pFar
21510 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  g->a[i].pExpr) )
21520 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
21530 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20  case( i==31 );. 
21540 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61           constMa
21550 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28  sk |= MASKBIT32(
21560 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
21570 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
21580 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
21590 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
215a0 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20  L)!=0 && !pColl 
215b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
215c0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
215d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
215e0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
215f0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
21600 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21610 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
21620 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29   if( constMask )
21630 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
21640 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
21650 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
21660 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67  e->nMem += nFarg
21670 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21680 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
21690 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
216a0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72  nge(pParse, nFar
216b0 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  g);.        }.. 
216c0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65         /* For le
216d0 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f  ngth() and typeo
216e0 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69  f() functions wi
216f0 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75  th a column argu
21700 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ment,.        **
21710 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61   set the P5 para
21720 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f  meter to the OP_
21730 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f  Column opcode to
21740 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
21750 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  G.        ** or 
21760 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
21770 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74   respectively, t
21780 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
21790 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20  ary data.       
217a0 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20   ** loading..   
217b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
217c0 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
217d0 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46  lags & (SQLITE_F
217e0 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54  UNC_LENGTH|SQLIT
217f0 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21  E_FUNC_TYPEOF))!
21800 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
21810 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20  u8 exprOp;.     
21820 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
21830 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg==1 );.       
21840 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67     assert( pFarg
21850 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
21860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  );.          exp
21870 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30  rOp = pFarg->a[0
21880 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  ].pExpr->op;.   
21890 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f         if( exprO
218a0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
218b0 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43  exprOp==TK_AGG_C
218c0 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
218d0 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
218e0 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d  ITE_FUNC_LENGTH=
218f0 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  =OPFLAG_LENGTHAR
21900 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
21910 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
21920 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46  FUNC_TYPEOF==OPF
21930 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b  LAG_TYPEOFARG );
21940 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
21950 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e  tcase( pDef->fun
21960 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  cFlags & OPFLAG_
21970 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
21980 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e           pFarg->
21990 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20  a[0].pExpr->op2 
219a0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
219b0 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46       pDef->funcF
219c0 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c  lags & (OPFLAG_L
219d0 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f  ENGTHARG|OPFLAG_
219e0 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20  TYPEOFARG);.    
219f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21a00 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  }..        sqlit
21a10 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
21a20 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
21a30 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
21a40 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  4be */.        s
21a50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
21a60 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
21a70 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20  Farg, r1, 0,.   
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
21aa0 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c  ITE_ECEL_DUP|SQL
21ab0 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
21ac0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21ad0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
21ae0 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54  arse);      /* T
21af0 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
21b00 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  be */.      }els
21b10 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
21b20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
21b30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
21b40 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
21b50 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76    /* Possibly ov
21b60 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74  erload the funct
21b70 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ion if the first
21b80 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20   argument is.   
21b90 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20     ** a virtual 
21ba0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  table column..  
21bb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21bc0 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69  For infix functi
21bd0 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c  ons (LIKE, GLOB,
21be0 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54   REGEXP, and MAT
21bf0 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20  CH) use the.    
21c00 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75    ** second argu
21c10 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69  ment, not the fi
21c20 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75  rst, as the argu
21c30 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a  ment to test to.
21c40 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
21c50 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  it is a column i
21c60 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  n a virtual tabl
21c70 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65  e.  This is done
21c80 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a   because.      *
21c90 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * the left opera
21ca0 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63  nd of infix func
21cb0 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61  tions (the opera
21cc0 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20  nd we want to.  
21cd0 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f      ** control o
21ce0 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73  verloading) ends
21cf0 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e   up as the secon
21d00 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
21d10 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  e.      ** funct
21d20 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73  ion.  The expres
21d30 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  sion "A glob B" 
21d40 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
21d50 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62   .      ** "glob
21d60 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20  (B,A).  We want 
21d70 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20  to use the A in 
21d80 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65  "A glob B" to te
21d90 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  st.      ** for 
21da0 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61  function overloa
21db0 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73  ding.  But we us
21dc0 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20  e the B term in 
21dd0 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20  "glob(B,A)"..   
21de0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
21df0 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78  nFarg>=2 && (pEx
21e00 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
21e10 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20  nfixFunc) ){.   
21e20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
21e30 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
21e40 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
21e50 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
21e60 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[1].pExpr);.   
21e70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61     }else if( nFa
21e80 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  rg>0 ){.        
21e90 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
21ea0 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
21eb0 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
21ec0 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rg, pFarg->a[0].
21ed0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
21ee0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
21ef0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
21f00 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
21f10 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
21f20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
21f30 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
21f40 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20  tColl; .        
21f50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21f60 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
21f70 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20   0, 0, 0, (char 
21f80 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
21f90 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  SEQ);.      }.#i
21fa0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
21fb0 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55  LE_OFFSET_SQL_FU
21fc0 4e 43 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  NC.      if( pDe
21fd0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
21fe0 51 4c 49 54 45 5f 46 55 4e 43 5f 4f 46 46 53 45  QLITE_FUNC_OFFSE
21ff0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  T ){.        Exp
22000 72 20 2a 70 41 72 67 20 3d 20 70 46 61 72 67 2d  r *pArg = pFarg-
22010 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
22020 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 6f       if( pArg->o
22030 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
22040 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22050 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
22060 50 5f 4f 66 66 73 65 74 2c 20 70 41 72 67 2d 3e  P_Offset, pArg->
22070 69 54 61 62 6c 65 2c 20 70 41 72 67 2d 3e 69 43  iTable, pArg->iC
22080 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
22090 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
220a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
220b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
220c0 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
220d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
220e0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
220f0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
22100 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22110 34 28 76 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  4(v, pParse->iSe
22120 6c 66 54 61 62 20 3f 20 4f 50 5f 50 75 72 65 46  lfTab ? OP_PureF
22130 75 6e 63 30 20 3a 20 4f 50 5f 46 75 6e 63 74 69  unc0 : OP_Functi
22140 6f 6e 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  on0,.           
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
22160 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61  onstMask, r1, ta
22170 72 67 65 74 2c 20 28 63 68 61 72 2a 29 70 44 65  rget, (char*)pDe
22180 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  f, P4_FUNCDEF);.
22190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
221a0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
221b0 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  u8)nFarg);.     
221c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61   }.      if( nFa
221d0 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d  rg && constMask=
221e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
221f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
22200 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
22210 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
22220 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  }.      return t
22230 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
22240 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22250 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
22260 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
22270 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
22280 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  : {.      int nC
22290 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ol;.      testca
222a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  se( op==TK_EXIST
222b0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
222c0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ase( op==TK_SELE
222d0 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
222e0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
222f0 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e   (nCol = pExpr->
22300 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
22310 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a  t->nExpr)!=1 ){.
22320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
22330 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
22340 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a  arse, nCol, 1);.
22350 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22360 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
22370 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
22380 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
22390 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
223a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
223b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  }.    case TK_SE
223c0 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  LECT_COLUMN: {. 
223d0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
223e0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
223f0 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b  ft->iTable==0 ){
22400 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
22410 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20  pLeft->iTable = 
22420 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
22430 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
22440 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29  pr->pLeft, 0, 0)
22450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22460 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
22470 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70  Table==0 || pExp
22480 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
22490 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
224a0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
224b0 6c 65 0a 20 20 20 20 20 20 20 26 26 20 70 45 78  le.       && pEx
224c0 70 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d  pr->iTable!=(n =
224d0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
224e0 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c  orSize(pExpr->pL
224f0 65 66 74 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  eft)) .      ){.
22500 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
22510 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
22520 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69  "%d columns assi
22530 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c  gned %d values",
22540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22560 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
22570 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
22580 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
22590 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20  pLeft->iTable + 
225a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
225b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
225c0 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
225d0 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
225e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
225f0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
22600 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
22610 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
22620 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
22630 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22640 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
22650 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
22660 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
22670 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
22680 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
22690 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
226a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
226b0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
226c0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
226d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
226e0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
226f0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
22700 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22710 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
22720 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  , target, 0);.  
22730 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
22740 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
22750 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
22760 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
22770 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
22780 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
22790 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f  QUERY */...    /
227a0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
227b0 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
227c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
227d0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
227e0 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
227f0 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
22800 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
22810 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
22820 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
22830 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
22840 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
22850 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
22860 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
22870 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
22880 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
22890 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
228a0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
228b0 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
228c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
228d0 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20  arget, 0, 0);.  
228e0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
228f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
22900 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63  e TK_SPAN:.    c
22910 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20  ase TK_COLLATE: 
22920 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
22930 55 53 3a 20 7b 0a 20 20 20 20 20 20 70 45 78 70  US: {.      pExp
22940 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  r = pExpr->pLeft
22950 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 70  ;.      goto exp
22960 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3b 0a 20  r_code_doover;. 
22970 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
22980 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20  K_TRIGGER: {.   
22990 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63     /* If the opc
229a0 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45  ode is TK_TRIGGE
229b0 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  R, then the expr
229c0 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65  ession is a refe
229d0 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74  rence.      ** t
229e0 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  o a column in th
229f0 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  e new.* or old.*
22a00 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61   pseudo-tables a
22a10 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20  vailable to.    
22a20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f    ** trigger pro
22a30 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63  grams. In this c
22a40 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20  ase Expr.iTable 
22a50 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20  is set to 1 for 
22a60 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77  the.      ** new
22a70 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
22a80 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c   or 0 for the ol
22a90 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
22aa0 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20  . Expr.iColumn. 
22ab0 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
22ac0 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  o the column of 
22ad0 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  the pseudo-table
22ae0 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20   to read, or to 
22af0 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  -1 to.      ** r
22b00 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69  ead the rowid fi
22b10 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eld..      **.  
22b20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65      ** The expre
22b30 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ssion is impleme
22b40 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50  nted using an OP
22b50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54  _Param opcode. T
22b60 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70  he p1.      ** p
22b70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20  arameter is set 
22b80 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e  to 0 for an old.
22b90 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
22ba0 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20   or to (i+1).   
22bb0 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e     ** to referen
22bc0 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d  ce another colum
22bd0 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70  n of the old.* p
22be0 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65  seudo-table, whe
22bf0 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69  re .      ** i i
22c00 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
22c10 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61  he column. For a
22c20 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72   new.rowid refer
22c30 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20  ence, p1 is.    
22c40 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31    ** set to (n+1
22c50 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68  ), where n is th
22c60 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
22c70 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75  mns in each pseu
22c80 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  do-table..      
22c90 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e  ** For a referen
22ca0 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20  ce to any other 
22cb0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
22cc0 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
22cd0 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73  , p1.      ** is
22ce0 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c   set to (n+2+i),
22cf0 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61   where n and i a
22d00 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72  re as defined pr
22d10 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20  eviously. For.  
22d20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20      ** example, 
22d30 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  if the table on 
22d40 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61  which triggers a
22d50 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69  re being fired i
22d60 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61  s.      ** decla
22d70 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a  red as:.      **
22d80 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41  .      **   CREA
22d90 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
22da0 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  );.      **.    
22db0 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20    ** Then p1 is 
22dc0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
22dd0 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
22de0 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
22df0 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f  0   ->    old.ro
22e00 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20  wid     p1==3   
22e10 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a  ->    new.rowid.
22e20 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31        **   p1==1
22e30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20     ->    old.a  
22e40 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d         p1==4   -
22e50 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20  >    new.a.     
22e60 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e   **   p1==2   ->
22e70 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20      old.b       
22e80 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20    p1==5   ->    
22e90 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20  new.b       .   
22ea0 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
22eb0 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d  e *pTab = pExpr-
22ec0 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  >pTab;.      int
22ed0 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61   p1 = pExpr->iTa
22ee0 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f  ble * (pTab->nCo
22ef0 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72  l+1) + 1 + pExpr
22f00 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20  ->iColumn;..    
22f10 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
22f20 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
22f30 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29  xpr->iTable==1 )
22f40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22f50 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
22f60 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  -1 && pExpr->iCo
22f70 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  lumn<pTab->nCol 
22f80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22f90 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
22fa0 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  | pExpr->iColumn
22fb0 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b  !=pTab->iPKey );
22fc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22fd0 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62  1>=0 && p1<(pTab
22fe0 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a  ->nCol*2+2) );..
22ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23000 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61  eAddOp2(v, OP_Pa
23010 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29  ram, p1, target)
23020 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
23030 65 6e 74 28 28 76 2c 20 22 72 5b 25 64 5d 3d 25  ent((v, "r[%d]=%
23040 73 2e 25 73 22 2c 20 74 61 72 67 65 74 2c 0a 20  s.%s", target,. 
23050 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
23060 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
23070 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
23080 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
23090 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
230a0 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  xpr->pTab->aCol[
230b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
230c0 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 29 29 3b  zName).      ));
230d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
230e0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
230f0 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66  OINT.      /* If
23100 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
23110 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69  REAL affinity, i
23120 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  t may currently 
23130 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a  be stored as an.
23140 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
23150 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66  . Use OP_RealAff
23160 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75  inity to make su
23170 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  re it is really 
23180 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  real..      **. 
23190 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
231a0 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36  -OF: R-60985-576
231b0 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63  62 SQLite will c
231c0 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75 65  onvert the value
231d0 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a   back to.      *
231e0 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
231f0 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67   when extracting
23200 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63   it from the rec
23210 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ord.  */.      i
23220 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
23230 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  n>=0 .       && 
23240 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  pTab->aCol[pExpr
23250 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  ->iColumn].affin
23260 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
23270 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20  REAL.      ){.  
23280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23290 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
232a0 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67  alAffinity, targ
232b0 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  et);.      }.#en
232c0 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
232d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
232e0 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20   TK_VECTOR: {.  
232f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
23300 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
23310 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
23320 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23330 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
23340 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b  K_IF_NULL_ROW: {
23350 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
23360 4e 52 3b 0a 20 20 20 20 20 20 61 64 64 72 49 4e  NR;.      addrIN
23370 52 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  R = sqlite3VdbeA
23380 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75  ddOp1(v, OP_IfNu
23390 6c 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54  llRow, pExpr->iT
233a0 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  able);.      sql
233b0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
233c0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
233d0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
233e0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
233f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
23400 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
23410 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
23420 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
23430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23440 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
23450 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73 71  drINR);.      sq
23460 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
23470 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69 6e  3(v, addrINR, in
23480 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
23490 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
234a0 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
234b0 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
234c0 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
234d0 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
234e0 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
234f0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
23500 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
23510 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
23520 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
23530 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
23540 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
23550 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
23560 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
23570 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
23580 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
23590 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
235a0 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
235b0 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
235c0 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
235d0 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
235e0 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
235f0 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
23600 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
23610 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
23620 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
23630 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
23640 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
23650 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20   is in the last 
23660 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72  element of pExpr
23670 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78  ->x.pList if pEx
23680 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
23690 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64  pr is.    ** odd
236a0 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
236b0 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
236c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
236d0 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74  ments in x.pList
236e0 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c  .    ** is even,
236f0 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74   then Y is omitt
23700 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65  ed and the "othe
23710 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73  rwise" result is
23720 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
23730 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
23740 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
23750 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
23760 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
23770 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
23780 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
23790 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
237a0 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
237b0 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
237c0 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
237d0 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
237e0 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
237f0 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
23800 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
23810 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
23820 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
23830 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
23840 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
23850 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
23860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23870 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
23880 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
23890 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
238a0 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238c0 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
238d0 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
238e0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
238f0 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
23920 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
23930 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23950 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
23960 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
23970 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
239a0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
239b0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
239c0 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
239d0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
239e0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
239f0 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
23a00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23a10 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
23a20 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
23a30 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
23a60 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
23a70 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
23a80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
23a90 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
23aa0 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
23ab0 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20  Ei (form B) */. 
23ac0 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69       VVA_ONLY( i
23ad0 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d  nt iCacheLevel =
23ae0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
23af0 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61  evel; )..      a
23b00 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
23b10 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23b20 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
23b30 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
23b40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
23b50 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
23b60 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
23b70 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
23b80 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
23b90 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
23ba0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
23bb0 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
23bc0 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
23bd0 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
23be0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
23bf0 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
23c00 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
23c10 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20  {.        tempX 
23c20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
23c30 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
23c40 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
23c50 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69        exprToRegi
23c60 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78 70  ster(&tempX, exp
23c70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
23c80 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67  se, &tempX, &reg
23c90 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20  Free1));.       
23ca0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
23cb0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
23cc0 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70    memset(&opComp
23cd0 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f  are, 0, sizeof(o
23ce0 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20 20  pCompare));.    
23cf0 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70      opCompare.op
23d00 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   = TK_EQ;.      
23d10 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66    opCompare.pLef
23d20 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20  t = &tempX;.    
23d30 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43      pTest = &opC
23d40 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20  ompare;.        
23d50 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39  /* Ticket b351d9
23d60 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62  5f9cd5ef17e9d9db
23d70 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30  ae18f5ca86111900
23d80 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  01:.        ** T
23d90 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46  he value in regF
23da0 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53  ree1 might get S
23db0 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65  Copy-ed into the
23dc0 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20   file result..  
23dd0 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65        ** So make
23de0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72   sure that the r
23df0 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72  egFree1 register
23e00 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66   is not reused f
23e10 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20  or other.       
23e20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64   ** purposes and
23e30 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72   possibly overwr
23e40 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20  itten.  */.     
23e50 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b     regFree1 = 0;
23e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
23e70 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d  or(i=0; i<nExpr-
23e80 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20  1; i=i+2){.     
23e90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
23ea0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
23eb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20  .        if( pX 
23ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
23ed0 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b  ert( pTest!=0 );
23ee0 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  .          opCom
23ef0 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c  pare.pRight = aL
23f00 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
23f10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
23f20 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74  .          pTest
23f30 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e   = aListelem[i].
23f40 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
23f50 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73  .        nextCas
23f60 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
23f70 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
23f80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
23f90 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Test->op==TK_COL
23fa0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
23fb0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23fc0 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
23fd0 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
23fe0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
23ff0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
24000 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
24010 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
24020 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
24030 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
24040 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
24050 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
24060 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
24070 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
24080 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
24090 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
240a0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
240b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
240c0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
240d0 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
240e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
240f0 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29  ( (nExpr&1)!=0 )
24100 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24110 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
24120 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
24130 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
24140 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
24150 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72  a[nExpr-1].pExpr
24160 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
24170 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
24180 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
24190 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
241a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
241b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
241c0 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
241d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
241e0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
241f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
24200 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
24210 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
24220 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
24230 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20  el==iCacheLevel 
24240 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24250 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
24260 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
24270 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24280 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
24290 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
242a0 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
242b0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
242c0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
242d0 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
242e0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
242f0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
24300 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
24310 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
24320 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
24330 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
24340 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
24350 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
24360 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
24370 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
24380 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24390 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
243a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
243b0 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
243c0 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
243d0 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
243e0 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
243f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
24400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24410 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
24420 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
24430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
24440 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
24450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
24460 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
24470 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
24480 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
24490 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
244a0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
244b0 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
244c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
244d0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
244e0 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
244f0 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
24500 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
24510 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56  en,0);.        V
24520 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
24530 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24540 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
24550 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
24560 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
24570 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20  AINT_TRIGGER,.  
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24590 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
245a0 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78  r->affinity, pEx
245b0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
245c0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
245d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
245e0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
245f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24600 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
24610 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
24620 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
24630 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
24640 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
24650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f  ;.}../*.** Facto
24660 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f  r out the code o
24670 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
24680 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
24690 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
246a0 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73 74 3e  *.** If regDest>
246b0 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  =0 then the resu
246c0 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f  lt is always sto
246d0 72 65 64 20 69 6e 20 74 68 61 74 20 72 65 67 69  red in that regi
246e0 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ster and the.** 
246f0 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 72 65  result is not re
24700 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65 67 44  usable.  If regD
24710 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69 73 20  est<0 then this 
24720 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65 65 20  routine is free 
24730 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  to .** store the
24740 20 76 61 6c 75 65 20 77 68 65 72 65 65 76 65 72   value whereever
24750 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68 65 20   it wants.  The 
24760 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 74  register where t
24770 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a  he expression .*
24780 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73 20 72  * is stored is r
24790 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e 20 72  eturned.  When r
247a0 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20 69 64  egDest<0, two id
247b0 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73 73 69  entical expressi
247c0 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65  ons will.** code
247d0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65 67   to the same reg
247e0 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
247f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
24800 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nit(.  Parse *pP
24810 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
24820 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24830 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
24840 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
24850 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65  sion to code whe
24860 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69  n the VDBE initi
24870 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20  alizes */.  int 
24880 72 65 67 44 65 73 74 20 20 20 20 20 20 20 2f 2a  regDest       /*
24890 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   Store the value
248a0 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
248b0 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  r */.){.  ExprLi
248c0 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  st *p;.  assert(
248d0 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
248e0 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20  Parse) );.  p = 
248f0 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
24900 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44 65 73  pr;.  if( regDes
24910 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20 20 20  t<0 && p ){.    
24920 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
24930 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
24940 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
24950 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d  pItem=p->a, i=p-
24960 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74  >nExpr; i>0; pIt
24970 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20  em++, i--){.    
24980 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75    if( pItem->reu
24990 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33  sable && sqlite3
249a0 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 49  ExprCompare(0,pI
249b0 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72  tem->pExpr,pExpr
249c0 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,-1)==0 ){.     
249d0 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d     return pItem-
249e0 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
249f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24a00 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 73 71    }.  pExpr = sq
24a10 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
24a20 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
24a30 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  0);.  p = sqlite
24a40 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
24a50 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72  pParse, p, pExpr
24a60 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
24a70 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
24a80 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
24a90 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d   &p->a[p->nExpr-
24aa0 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  1];.     pItem->
24ab0 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67 44 65  reusable = regDe
24ac0 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28 20 72  st<0;.     if( r
24ad0 65 67 44 65 73 74 3c 30 20 29 20 72 65 67 44 65  egDest<0 ) regDe
24ae0 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  st = ++pParse->n
24af0 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  Mem;.     pItem-
24b00 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
24b10 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a   = regDest;.  }.
24b20 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74    pParse->pConst
24b30 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74 75  Expr = p;.  retu
24b40 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f  rn regDest;.}../
24b50 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24b60 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
24b70 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
24b80 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
24b90 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
24ba0 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
24bb0 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
24bc0 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
24bd0 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
24be0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
24bf0 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
24c00 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
24c10 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
24c20 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
24c30 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
24c40 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
24c50 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
24c60 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
24c70 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
24c80 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
24c90 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
24ca0 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
24cb0 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
24cc0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
24cd0 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
24ce0 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
24cf0 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
24d00 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
24d10 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
24d20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
24d30 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
24d40 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
24d50 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
24d60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
24d70 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
24d80 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
24d90 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
24da0 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
24db0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
24dc0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
24dd0 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73  xpr);.  if( Cons
24de0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
24df0 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f  ).   && pExpr->o
24e00 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  p!=TK_REGISTER. 
24e10 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
24e20 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
24e30 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20  n(pExpr).  ){.  
24e40 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20    *pReg  = 0;.  
24e50 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
24e60 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
24e70 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b  rse, pExpr, -1);
24e80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
24e90 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
24ea0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
24eb0 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
24ec0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
24ed0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24ee0 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d  r1);.    if( r2=
24ef0 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  =r1 ){.      *pR
24f00 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c  eg = r1;.    }el
24f10 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
24f20 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
24f30 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
24f40 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
24f50 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24f60 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   r2;.}../*.** Ge
24f70 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
24f80 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
24f90 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
24fa0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
24fb0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
24fc0 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
24fd0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
24fe0 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
24ff0 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
25000 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69  r target..*/.voi
25010 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
25020 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
25030 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
25040 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74  t target){.  int
25050 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72   inReg;..  asser
25060 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
25070 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
25080 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78  Mem );.  if( pEx
25090 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  pr && pExpr->op=
250a0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
250b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
250c0 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
250d0 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45  dbe, OP_Copy, pE
250e0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
250f0 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  get);.  }else{. 
25100 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
25110 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
25120 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
25130 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73  target);.    ass
25140 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
25150 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  be!=0 || pParse-
25160 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
25170 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52  d );.    if( inR
25180 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50  eg!=target && pP
25190 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
251a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
251b0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
251c0 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
251d0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
251e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
251f0 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69  ** Make a transi
25200 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72  ent copy of expr
25210 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
25220 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73   then code it us
25230 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78  ing.** sqlite3Ex
25240 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20  prCode().  This 
25250 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75  routine works ju
25260 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45  st like sqlite3E
25270 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63  xprCode().** exc
25280 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e 70  ept that the inp
25290 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ut expression is
252a0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
252b0 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
252c0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
252d0 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a  CodeCopy(Parse *
252e0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
252f0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
25300 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
25310 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
25320 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
25330 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
25340 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  , 0);.  if( !db-
25350 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
25360 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
25370 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
25380 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  arget);.  sqlite
25390 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
253a0 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
253b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
253c0 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
253d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
253e0 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
253f0 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
25400 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
25410 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
25420 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
25430 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
25440 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49 66  ster target.  If
25450 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
25460 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  is constant, the
25470 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
25480 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74  * might choose t
25490 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72 65  o code the expre
254a0 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c  ssion at initial
254b0 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f  ization time..*/
254c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
254d0 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
254e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
254f0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
25500 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70  target){.  if( p
25510 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
25520 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45  ctor && sqlite3E
25530 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
25540 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  xpr) ){.    sqli
25550 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
25560 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
25570 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
25580 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
25590 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
255a0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
255b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
255c0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
255d0 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76  valuates the giv
255e0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
255f0 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
25600 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
25610 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
25620 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
25630 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
25640 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
25650 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
25660 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
25670 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
25680 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
25690 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
256a0 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
256b0 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
256c0 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
256d0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
256e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
256f0 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
25700 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
25710 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
25720 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
25730 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
25740 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
25750 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
25760 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
25770 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25780 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
25790 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
257a0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
257b0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
257c0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
257d0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d  Vdbe;.  int iMem
257e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
257f0 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
25800 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
25810 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73  _REGISTER );.  s
25820 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
25830 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
25840 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20  rget);.  iMem = 
25850 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
25860 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25870 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
25880 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20  target, iMem);. 
25890 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
258a0 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a  pExpr, iMem);.}.
258b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
258c0 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
258d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
258e0 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
258f0 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
25900 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  ession list into
25910 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
25920 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
25930 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a  ng at target..**
25940 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
25950 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
25960 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20 54 68  s evaluated.  Th
25970 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
25980 64 20 77 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c  d will.** usuall
25990 79 20 62 65 20 70 4c 69 73 74 2d 3e 6e 45 78 70  y be pList->nExp
259a0 72 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 72  r but might be r
259b0 65 64 75 63 65 64 20 69 66 20 53 51 4c 49 54 45  educed if SQLITE
259c0 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a  _ECEL_OMITREF.**
259d0 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a   is defined..**.
259e0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
259f0 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76  EL_DUP flag prev
25a00 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e  ents the argumen
25a10 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ts from being.**
25a20 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50   filled using OP
25a30 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79  _SCopy.  OP_Copy
25a40 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e   must be used in
25a50 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stead..**.** The
25a60 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
25a70 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c  TOR argument all
25a80 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ows constant arg
25a90 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20  uments to be.** 
25aa0 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74  factored out int
25ab0 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
25ac0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
25ad0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
25ae0 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74   flag means that
25af0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
25b00 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  the list with.**
25b10 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e   ExprList.a[].u.
25b20 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
25b30 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
25b40 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  n evaluated and 
25b50 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67  stored.** in reg
25b60 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65 67  isters at srcReg
25b70 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c  , and so the val
25b80 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64  ue can be copied
25b90 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a 20   from there..** 
25ba0 49 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f  If SQLITE_ECEL_O
25bb0 4d 49 54 52 45 46 20 69 73 20 61 6c 73 6f 20 73  MITREF is also s
25bc0 65 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  et, then the val
25bd0 75 65 73 20 77 69 74 68 20 75 2e 78 2e 69 4f 72  ues with u.x.iOr
25be0 64 65 72 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72  derByCol>0.** ar
25bf0 65 20 73 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64  e simply omitted
25c00 20 72 61 74 68 65 72 20 74 68 61 6e 20 62 65 69   rather than bei
25c10 6e 67 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 73  ng copied from s
25c20 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rcReg..*/.int sq
25c30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
25c40 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
25c50 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
25c60 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
25c70 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
25c80 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
25c90 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
25ca0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
25cb0 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
25cc0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
25cd0 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
25ce0 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20   int srcReg,    
25cf0 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65      /* Source re
25d00 67 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54  gisters if SQLIT
25d10 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20  E_ECEL_REF */.  
25d20 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  u8 flags        
25d30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45     /* SQLITE_ECE
25d40 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  L_* flags */.){.
25d50 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
25d60 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
25d70 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
25d80 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61  u8 copyOp = (fla
25d90 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
25da0 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20  _DUP) ? OP_Copy 
25db0 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64  : OP_SCopy;.  Vd
25dc0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
25dd0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
25de0 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
25df0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
25e00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
25e10 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  rse->pVdbe!=0 );
25e20 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20    /* Never gets 
25e30 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69  this far otherwi
25e40 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73  se */.  n = pLis
25e50 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
25e60 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70  !ConstFactorOk(p
25e70 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26  Parse) ) flags &
25e80 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  = ~SQLITE_ECEL_F
25e90 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74  ACTOR;.  for(pIt
25ea0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
25eb0 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
25ec0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
25ed0 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  pExpr = pItem->p
25ee0 45 78 70 72 3b 0a 23 69 66 64 65 66 20 53 51 4c  Expr;.#ifdef SQL
25ef0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
25f00 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
25f10 20 69 66 28 20 70 49 74 65 6d 2d 3e 62 53 6f 72   if( pItem->bSor
25f20 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20  terRef ){.      
25f30 69 2d 2d 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  i--;.      n--;.
25f40 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
25f50 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
25f60 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  & SQLITE_ECEL_RE
25f70 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20 70 49  F)!=0 && (j = pI
25f80 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
25f90 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20  yCol)>0 ){.     
25fa0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
25fb0 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
25fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b   ){.        i--;
25fd0 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  .        n--;.  
25fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25ff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26000 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
26010 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61 72 67  j+srcReg-1, targ
26020 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  et+i);.      }. 
26030 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
26040 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
26050 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20  L_FACTOR)!=0 && 
26060 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
26070 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
26080 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26090 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
260a0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
260b0 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t+i);.    }else{
260c0 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67  .      int inReg
260d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
260e0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
260f0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
26100 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
26110 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a  eg!=target+i ){.
26120 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
26130 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pOp;.        if(
26140 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79   copyOp==OP_Copy
26150 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4f  .         && (pO
26160 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  p=sqlite3VdbeGet
26170 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f  Op(v, -1))->opco
26180 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  de==OP_Copy.    
26190 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b       && pOp->p1+
261a0 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67  pOp->p3+1==inReg
261b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
261c0 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p2+pOp->p3+1==
261d0 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20  target+i.       
261e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
261f0 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20  p->p3++;.       
26200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26220 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69  Op2(v, copyOp, i
26230 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b  nReg, target+i);
26240 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26250 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
26260 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
26270 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
26280 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70  for a BETWEEN op
26290 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  erator..**.**   
262a0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
262b0 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f   z.**.** The abo
262c0 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  ve is equivalent
262d0 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e   to .**.**    x>
262e0 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a  =y AND x<=z.**.*
262f0 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63  * Code it as suc
26300 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74  h, taking care t
26310 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o do the common 
26320 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
26330 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20   elimination of 
26340 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75  x..**.** The xJu
26350 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20 64  mpIf parameter d
26360 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69 6c  etermines detail
26370 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c  s:.**.**    NULL
26380 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
26390 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62 6f      Store the bo
263a0 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e 20  olean result in 
263b0 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20  reg[dest].**    
263c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
263d0 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f 20  e:      Jump to 
263e0 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a 20  dest if true.** 
263f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26400 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70 20  False:     Jump 
26410 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73 65  to dest if false
26420 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49  .**.** The jumpI
26430 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  fNull parameter 
26440 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78 4a  is ignored if xJ
26450 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a  umpIf is NULL..*
26460 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
26470 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20  prCodeBetween(. 
26480 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
26490 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
264a0 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
264b0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
264c0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
264d0 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20   /* The BETWEEN 
264e0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
264f0 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20  int dest,       
26500 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
26510 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65  ation or storage
26520 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76   location */.  v
26530 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61 72  oid (*xJump)(Par
26540 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e  se*,Expr*,int,in
26550 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f  t), /* Action to
26560 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   take */.  int j
26570 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
26580 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
26590 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
265a0 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72  NULL */.){. Expr
265b0 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a   exprAnd;     /*
265c0 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   The AND operato
265d0 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78  r in  x>=y AND x
265e0 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63  <=z  */.  Expr c
265f0 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54  ompLeft;    /* T
26600 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a  he  x>=y  term *
26610 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67  /.  Expr compRig
26620 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c  ht;   /* The  x<
26630 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =z  term */.  Ex
26640 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20  pr exprX;       
26650 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78  /* The  x  subex
26660 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
26670 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
26680 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
26690 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20   register */... 
266a0 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66   memset(&compLef
266b0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
266c0 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63  r));.  memset(&c
266d0 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a  ompRight, 0, siz
266e0 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65  eof(Expr));.  me
266f0 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30  mset(&exprAnd, 0
26700 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
26710 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ..  assert( !Exp
26720 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
26730 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
26740 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a  ) );.  exprX = *
26750 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
26760 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f  exprAnd.op = TK_
26770 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  AND;.  exprAnd.p
26780 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
26790 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67  ;.  exprAnd.pRig
267a0 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b  ht = &compRight;
267b0 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d  .  compLeft.op =
267c0 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65   TK_GE;.  compLe
267d0 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ft.pLeft = &expr
267e0 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52  X;.  compLeft.pR
267f0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
26800 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
26810 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f  r;.  compRight.o
26820 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d  p = TK_LE;.  com
26830 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26  pRight.pLeft = &
26840 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67  exprX;.  compRig
26850 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ht.pRight = pExp
26860 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
26870 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f  .pExpr;.  exprTo
26880 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58 2c  Register(&exprX,
26890 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
268a0 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
268b0 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69  &regFree1));.  i
268c0 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20  f( xJump ){.    
268d0 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20 26 65  xJump(pParse, &e
268e0 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
268f0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c  mpIfNull);.  }el
26900 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  se{.    /* Mark 
26910 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
26920 73 20 62 65 69 6e 67 20 66 72 6f 6d 20 74 68 65  s being from the
26930 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
26940 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20  use of a join.  
26950 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65    ** so that the
26960 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
26970 54 61 72 67 65 74 28 29 20 72 6f 75 74 69 6e 65  Target() routine
26980 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70   will not attemp
26990 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20 2a 2a  t to move.    **
269a0 20 69 74 20 69 6e 74 6f 20 74 68 65 20 50 61 72   it into the Par
269b0 73 65 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c 69  se.pConstExpr li
269c0 73 74 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 75  st.  We should u
269d0 73 65 20 61 20 6e 65 77 20 62 69 74 20 66 6f 72  se a new bit for
269e0 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a 20 66 6f   this,.    ** fo
269f0 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74 20 77  r clarity, but w
26a00 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62 69 74  e are out of bit
26a10 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e 66 6c  s in the Expr.fl
26a20 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77 65 0a  ags field so we.
26a30 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f 20 72      ** have to r
26a40 65 75 73 65 20 74 68 65 20 45 50 5f 46 72 6f 6d  euse the EP_From
26a50 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65  Join bit.  Bumme
26a60 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70 72 58 2e  r. */.    exprX.
26a70 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d  flags |= EP_From
26a80 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  Join;.    sqlite
26a90 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
26aa0 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
26ab0 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73  , dest);.  }.  s
26ac0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
26ad0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
26ae0 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e  Free1);..  /* En
26af0 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65  sure adequate te
26b00 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  st coverage */. 
26b10 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
26b20 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
26b30 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
26b40 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
26b50 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
26b60 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
26b70 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
26b80 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
26b90 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
26ba0 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26bb0 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26bc0 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
26bd0 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
26be0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
26bf0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26c00 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
26c10 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
26c20 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
26c30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26c40 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
26c50 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
26c60 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
26c70 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
26c80 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26c90 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26ca0 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
26cb0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
26cc0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26cd0 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26ce0 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
26cf0 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
26d00 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26d10 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26d20 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
26d30 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
26d40 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
26d50 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
26d60 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d  e( xJump==0 );.}
26d70 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
26d80 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
26d90 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
26da0 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
26db0 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
26dc0 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
26dd0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
26de0 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
26df0 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
26e00 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
26e10 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
26e20 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
26e30 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
26e40 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
26e50 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
26e60 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
26e70 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
26e80 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
26e90 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
26ea0 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
26eb0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
26ec0 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
26ed0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
26ee0 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
26ef0 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
26f00 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
26f10 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
26f20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
26f30 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
26f40 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
26f50 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
26f60 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
26f70 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
26f80 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
26f90 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
26fa0 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
26fb0 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
26fc0 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
26fd0 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
26fe0 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
26ff0 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
27000 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
27010 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
27020 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
27030 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
27040 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
27050 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
27060 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
27070 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
27080 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
27090 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
270a0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
270b0 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
270c0 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
270d0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
270e0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
270f0 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
27100 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
27110 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75  v==0) )     retu
27120 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63  rn;  /* Existenc
27130 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
27140 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
27150 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
27160 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
27170 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63  /* No way this c
27180 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f  an happen */.  o
27190 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
271a0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
271b0 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
271c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
271d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
271e0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
271f0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
27200 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
27210 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
27220 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
27230 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d  r->pLeft, d2,jum
27240 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
27250 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
27260 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
27270 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
27280 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27290 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
272a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
272b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
272c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
272d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
272e0 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
272f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
27300 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
27310 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27320 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
27330 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27340 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
27350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27360 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
27370 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
27380 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
27390 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
273a0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
273b0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
273c0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
273d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
273e0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
273f0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
27400 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
27410 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
27420 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27430 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
27440 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27450 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
27460 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27470 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
27480 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
27490 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
274a0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
274b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
274c0 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20  TK_TRUTH: {.    
274d0 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 20    int isNot;    
274e0 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55 45    /* IS NOT TRUE
274f0 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c 53 45   or IS NOT FALSE
27500 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73   */.      int is
27510 54 72 75 65 3b 20 20 20 20 20 2f 2a 20 49 53 20  True;     /* IS 
27520 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54  TRUE or IS NOT T
27530 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  RUE */.      tes
27540 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27550 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73  l==0 );.      is
27560 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32  Not = pExpr->op2
27570 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20  ==TK_ISNOT;.    
27580 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74    isTrue = sqlit
27590 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65  e3ExprTruthValue
275a0 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
275b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
275c0 20 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74   isTrue && isNot
275d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
275e0 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20 69  se( !isTrue && i
275f0 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66  sNot );.      if
27600 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74  ( isTrue ^ isNot
27610 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
27620 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(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 64 65 73 74 2c 0a 20 20 20 20 20 20  ft, dest,.      
27650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27660 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c 49      isNot ? SQLI
27670 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a 20  TE_JUMPIFNULL : 
27680 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
27690 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
276a0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
276b0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
276c0 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54     isNot ? SQLIT
276f0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30  E_JUMPIFNULL : 0
27700 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27710 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27720 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
27730 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
27740 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27750 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20   op==TK_IS );.  
27760 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
27770 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
27780 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
27790 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
277a0 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70  K_NE;.      jump
277b0 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f  IfNull = SQLITE_
277c0 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a  NULLEQ;.      /*
277d0 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   Fall thru */.  
277e0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
277f0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
27800 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
27810 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
27820 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
27830 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
27840 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
27850 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45  3ExprIsVector(pE
27860 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f  xpr->pLeft) ) go
27870 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b  to default_expr;
27880 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27890 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
278a0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
278b0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
278c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
278d0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
278e0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
278f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
27900 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
27910 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
27920 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
27930 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
27940 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
27950 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27970 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
27980 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27990 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
279a0 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
279b0 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
279c0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
279d0 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
279e0 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
279f0 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
27a00 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
27a10 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
27a20 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
27a30 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
27a40 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
27a50 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
27a60 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
27a70 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
27a80 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
27a90 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
27aa0 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
27ab0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
27ac0 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
27ad0 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
27ae0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
27af0 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Eq);.      Vdbe
27b00 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
27b10 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
27b20 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
27b30 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
27b40 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27b50 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
27b60 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
27b70 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73  ULLEQ);.      as
27b80 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
27b90 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
27ba0 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56  =OP_Ne);.      V
27bb0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27bc0 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
27bd0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
27be0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
27bf0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27c00 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
27c10 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
27c20 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
27c30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27c40 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
27c50 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
27c60 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
27c70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27c80 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
27c90 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
27ca0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
27cb0 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
27cc0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
27cd0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
27ce0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
27cf0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
27d00 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
27d10 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
27d20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
27d30 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
27d40 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
27d50 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
27d60 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
27d70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27d80 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
27d90 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56  , dest);.      V
27da0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27db0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
27dc0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27dd0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
27de0 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
27df0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
27e00 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
27e10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27e20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
27e30 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
27e40 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27e50 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
27e60 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
27e70 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
27e80 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
27e90 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27ea0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27eb0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
27ec0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
27ed0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
27ee0 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
27ef0 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
27f00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
27f10 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
27f20 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e  IfNull = jumpIfN
27f30 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73  ull ? dest : des
27f40 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20  tIfFalse;.      
27f50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
27f60 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
27f70 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
27f80 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
27f90 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
27fa0 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
27fb0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27fc0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
27fd0 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
27fe0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
27ff0 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
28000 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65   {.    default_e
28010 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20 65  xpr:.      if( e
28020 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45  xprAlwaysTrue(pE
28030 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
28040 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
28050 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
28060 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
28070 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
28080 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
28090 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
280a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
280b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
280c0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
280d0 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
280e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
280f0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
28100 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  _If, r1, dest, j
28110 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
28120 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
28130 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
28140 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
28150 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
28160 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
28170 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
28180 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
28190 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
281a0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
281b0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
281c0 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
281d0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
281e0 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
281f0 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65    .}../*.** Gene
28200 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
28210 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
28220 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
28230 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
28240 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
28250 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
28260 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75  sion is false bu
28270 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
28280 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
28290 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
282a0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
282b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
282c0 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
282d0 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
282e0 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
282f0 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  lse) then.** jum
28300 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  p if jumpIfNull 
28310 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
28320 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72  NULL or fall thr
28330 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
28340 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76  ll.** is 0..*/.v
28350 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
28360 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50  fFalse(Parse *pP
28370 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
28380 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
28390 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
283a0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
283b0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
283c0 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
283d0 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
283e0 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
283f0 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
28400 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
28410 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
28420 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
28430 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
28440 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
28450 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e  turn; /* Existen
28460 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
28470 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
28480 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
28490 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f      return;..  /
284a0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
284b0 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
284c0 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
284d0 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
284e0 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
284f0 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
28500 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
28510 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
28520 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
28530 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
28540 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
28550 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
28560 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
28570 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
28580 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
28590 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
285a0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
285b0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
285c0 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
285d0 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
285e0 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
285f0 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
28600 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
28610 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
28620 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
28630 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
28640 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
28650 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
28660 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
28670 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
28680 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
28690 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
286a0 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
286b0 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
286c0 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
286d0 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
286e0 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
286f0 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
28700 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
28710 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
28720 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
28730 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
28740 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
28750 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
28760 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
28770 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
28780 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
28790 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
287a0 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
287b0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
287c0 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
287d0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
287e0 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
287f0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
28800 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
28810 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
28820 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
28830 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
28840 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
28850 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
28860 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
28870 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
28880 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
28890 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
288a0 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
288b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
288c0 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
288d0 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
288e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
288f0 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
28900 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
28910 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
28920 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
28930 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
28940 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
28950 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
28960 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
28970 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
28980 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28990 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
289a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
289b0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
289c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
289d0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
289e0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
289f0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
28a00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
28a10 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
28a20 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
28a30 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
28a40 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
28a50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
28a60 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
28a70 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
28a80 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
28a90 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
28aa0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
28ab0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
28ac0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
28ad0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
28ae0 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49  pLeft, d2, jumpI
28af0 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
28b00 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
28b10 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
28b20 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
28b30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
28b40 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
28b50 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
28b60 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28b70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28b80 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
28b90 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
28ba0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
28bb0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
28bc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
28bd0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
28be0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28bf0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28c00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28c10 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
28c20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
28c30 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
28c40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
28c50 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
28c60 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20  _TRUTH: {.      
28c70 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20  int isNot;   /* 
28c80 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49  IS NOT TRUE or I
28c90 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20  S NOT FALSE */. 
28ca0 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b       int isTrue;
28cb0 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20    /* IS TRUE or 
28cc0 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20  IS NOT TRUE */. 
28cd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28ce0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28cf0 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45        isNot = pE
28d00 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e  xpr->op2==TK_ISN
28d10 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65  OT;.      isTrue
28d20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72   = sqlite3ExprTr
28d30 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e  uthValue(pExpr->
28d40 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74  pRight);.      t
28d50 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20  estcase( isTrue 
28d60 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20  && isNot );.    
28d70 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54    testcase( !isT
28d80 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a  rue && isNot );.
28d90 20 20 20 20 20 20 69 66 28 20 69 73 54 72 75 65        if( isTrue
28da0 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20   ^ isNot ){.    
28db0 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 61      /* IS TRUE a
28dc0 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20  nd IS NOT FALSE 
28dd0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
28de0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
28df0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
28e00 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20  ft, dest,.      
28e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a       isNot ? 0 :
28e30 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
28e40 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73  LL);..      }els
28e50 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53  e{.        /* IS
28e60 20 46 41 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f   FALSE and IS NO
28e70 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20  T TRUE */.      
28e80 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
28e90 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
28ea0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a  r->pLeft, dest,.
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ec0 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20            isNot 
28ed0 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d  ? 0 : SQLITE_JUM
28ee0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
28ef0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
28f00 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
28f10 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
28f20 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
28f30 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
28f40 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
28f50 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
28f60 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
28f70 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70  );.      op = (p
28f80 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29  Expr->op==TK_IS)
28f90 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51   ? TK_NE : TK_EQ
28fa0 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75  ;.      jumpIfNu
28fb0 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ll = SQLITE_NULL
28fc0 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  EQ;.      /* Fal
28fd0 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61  l thru */.    ca
28fe0 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
28ff0 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
29000 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
29010 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
29020 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
29030 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
29040 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
29050 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d  rIsVector(pExpr-
29060 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64  >pLeft) ) goto d
29070 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20  efault_expr;.   
29080 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
29090 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
290a0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
290b0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
290c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
290d0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
290e0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
290f0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
29100 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
29110 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
29120 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
29130 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
29140 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
29150 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
29170 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
29180 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
29190 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
291a0 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
291b0 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
291c0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
291d0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
291e0 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
291f0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
29200 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
29210 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
29220 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
29230 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
29240 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
29250 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
29260 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
29270 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29280 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
29290 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
292a0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
292b0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
292c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
292d0 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
292e0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
292f0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
29300 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
29310 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
29320 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
29330 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
29340 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
29350 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
29360 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
29370 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Q);.      assert
29380 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
29390 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
293a0 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Ne);.      VdbeC
293b0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
293c0 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
293d0 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
293e0 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
293f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
29400 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
29410 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
29420 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
29430 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
29440 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
29450 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
29460 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
29470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
29480 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
29490 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
294a0 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
294b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
294c0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
294d0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
294e0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
294f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
29500 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
29510 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
29520 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20  ==TK_ISNULL );  
29530 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
29540 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
29550 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
29560 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
29570 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  L );  VdbeCovera
29580 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
29590 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
295a0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
295b0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
295c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
295d0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
295e0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
295f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
29600 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
29610 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
29620 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71   pExpr, dest, sq
29630 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
29640 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
29650 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29660 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
29670 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
29680 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
29690 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49  .      if( jumpI
296a0 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  fNull ){.       
296b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
296c0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
296d0 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20  , dest, dest);. 
296e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
296f0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
29700 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
29710 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
29720 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29730 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
29740 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
29750 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
29760 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
29770 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
29780 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
29790 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
297a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
297b0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64  default: {.    d
297c0 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20  efault_expr: .  
297d0 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61      if( exprAlwa
297e0 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29  ysFalse(pExpr) )
297f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29800 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
29810 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
29820 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
29830 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
29840 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
29850 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29860 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
29870 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
29880 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
29890 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
298a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
298b0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op3(v, OP_IfNot,
298c0 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
298d0 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
298e0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
298f0 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
29900 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
29910 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
29920 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
29930 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  l==0 );.      }.
29940 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29950 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
29960 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
29970 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
29980 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
29990 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
299a0 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a  , regFree2);.}..
299b0 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74  /*.** Like sqlit
299c0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29 20  e3ExprIfFalse() 
299d0 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63 6f  except that a co
299e0 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45  py is made of pE
299f0 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  xpr before.** co
29a00 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61  de generation, a
29a10 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73 20  nd that copy is 
29a20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f  deleted after co
29a30 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54  de generation. T
29a40 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74  his.** ensures t
29a50 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
29a60 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e   pExpr is unchan
29a70 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ged..*/.void sql
29a80 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 44  ite3ExprIfFalseD
29a90 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
29aa0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
29ab0 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70  nt dest,int jump
29ac0 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74  IfNull){.  sqlit
29ad0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
29ae0 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f  >db;.  Expr *pCo
29af0 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  py = sqlite3Expr
29b00 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
29b10 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
29b20 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
29b30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
29b40 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
29b50 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Copy, dest, jump
29b60 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73  IfNull);.  }.  s
29b70 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
29b80 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a  (db, pCopy);.}..
29b90 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e  /*.** Expression
29ba0 20 70 56 61 72 20 69 73 20 67 75 61 72 61 6e 74   pVar is guarant
29bb0 65 65 64 20 74 6f 20 62 65 20 61 6e 20 53 51 4c  eed to be an SQL
29bc0 20 76 61 72 69 61 62 6c 65 2e 20 70 45 78 70 72   variable. pExpr
29bd0 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a 2a 20 74   may be any.** t
29be0 79 70 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ype of expressio
29bf0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  n..**.** If pExp
29c00 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51  r is a simple SQ
29c10 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20 69 6e 74  L value - an int
29c20 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69  eger, real, stri
29c30 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e  ng, blob.** or N
29c40 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74 68 65 6e  ULL value - then
29c50 20 74 68 65 20 56 44 42 45 20 63 75 72 72 65 6e   the VDBE curren
29c60 74 6c 79 20 62 65 69 6e 67 20 70 72 65 70 61 72  tly being prepar
29c70 65 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  ed is configured
29c80 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65 70 61 72  .** to re-prepar
29c90 65 20 65 61 63 68 20 74 69 6d 65 20 61 20 6e 65  e each time a ne
29ca0 77 20 76 61 6c 75 65 20 69 73 20 62 6f 75 6e 64  w value is bound
29cb0 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61   to variable pVa
29cc0 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f  r..**.** Additio
29cd0 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78 70 72 20  nally, if pExpr 
29ce0 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20  is a simple SQL 
29cf0 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61  value and the va
29d00 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61  lue is the.** sa
29d10 6d 65 20 61 73 20 74 68 61 74 20 63 75 72 72 65  me as that curre
29d20 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20 76 61  ntly bound to va
29d30 72 69 61 62 6c 65 20 70 56 61 72 2c 20 6e 6f 6e  riable pVar, non
29d40 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
29d50 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  d..** Otherwise,
29d60 20 69 66 20 74 68 65 20 76 61 6c 75 65 73 20 61   if the values a
29d70 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20  re not the same 
29d80 6f 72 20 69 66 20 70 45 78 70 72 20 69 73 20 6e  or if pExpr is n
29d90 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 53  ot a simple.** S
29da0 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72 6f 20 69  QL value, zero i
29db0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
29dc0 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
29dd0 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 50 61  mpareVariable(Pa
29de0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
29df0 72 20 2a 70 56 61 72 2c 20 45 78 70 72 20 2a 70  r *pVar, Expr *p
29e00 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 73  Expr){.  int res
29e10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 72   = 0;.  int iVar
29e20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
29e30 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a  e *pL, *pR = 0;.
29e40 20 20 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75    .  sqlite3Valu
29e50 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
29e60 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c  ->db, pExpr, SQL
29e70 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
29e80 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70 52 29 3b  _AFF_BLOB, &pR);
29e90 0a 20 20 69 66 28 20 70 52 20 29 7b 0a 20 20 20  .  if( pR ){.   
29ea0 20 69 56 61 72 20 3d 20 70 56 61 72 2d 3e 69 43   iVar = pVar->iC
29eb0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74  olumn;.    sqlit
29ec0 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
29ed0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
29ee0 69 56 61 72 29 3b 0a 20 20 20 20 70 4c 20 3d 20  iVar);.    pL = 
29ef0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f  sqlite3VdbeGetBo
29f00 75 6e 64 56 61 6c 75 65 28 70 50 61 72 73 65 2d  undValue(pParse-
29f10 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69 56 61  >pReprepare, iVa
29f20 72 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  r, SQLITE_AFF_BL
29f30 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 20  OB);.    if( pL 
29f40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
29f50 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
29f60 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  pL)==SQLITE_TEXT
29f70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29f80 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
29f90 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  L); /* Make sure
29fa0 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73   the encoding is
29fb0 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20   UTF-8 */.      
29fc0 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 20 30  }.      res =  0
29fd0 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  ==sqlite3MemComp
29fe0 61 72 65 28 70 4c 2c 20 70 52 2c 20 30 29 3b 0a  are(pL, pR, 0);.
29ff0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2a000 33 56 61 6c 75 65 46 72 65 65 28 70 52 29 3b 0a  3ValueFree(pR);.
2a010 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
2a020 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20  Free(pL);.  }.. 
2a030 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
2a040 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20  /*.** Do a deep 
2a050 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77  comparison of tw
2a060 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  o expression tre
2a070 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  es.  Return 0 if
2a080 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
2a090 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70  essions are comp
2a0a0 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c  letely identical
2a0b0 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
2a0c0 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a  hey differ only.
2a0d0 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20  ** by a COLLATE 
2a0e0 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65 20  operator at the 
2a0f0 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75  top level.  Retu
2a100 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61 72  rn 2 if there ar
2a110 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a  e differences.**
2a120 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
2a130 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54  top-level COLLAT
2a140 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  E operator..**.*
2a150 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d  * If any subelem
2a160 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78  ent of pB has Ex
2a170 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20  pr.iTable==(-1) 
2a180 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77  then it is allow
2a190 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65  ed.** to compare
2a1a0 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75   equal to an equ
2a1b0 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20  ivalent element 
2a1c0 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e  in pA with Expr.
2a1d0 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a  iTable==iTab..**
2a1e0 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65 20  .** The pA side 
2a1f0 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20 54  might be using T
2a200 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66 20  K_REGISTER.  If 
2a210 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
2a220 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f   and pB is.** no
2a230 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53  t using TK_REGIS
2a240 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65 72  TER but is other
2a250 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c  wise equivalent,
2a260 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
2a270 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  rn 0..**.** Some
2a280 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69  times this routi
2a290 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32  ne will return 2
2a2a0 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f   even if the two
2a2b0 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
2a2c0 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76  really are equiv
2a2d0 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61  alent.  If we ca
2a2e0 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20  nnot prove that 
2a2f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
2a300 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  are.** identical
2a310 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75  , we return 2 ju
2a320 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20  st to be safe.  
2a330 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
2a340 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c  ne.** returns 2,
2a350 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74   then you do not
2a360 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72   really know for
2a370 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20   certain if the 
2a380 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
2a390 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
2a3a0 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74    But if you get
2a3b0 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e   a 0 or 1 return
2a3c0 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61  , then you.** ca
2a3d0 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78  n be sure the ex
2a3e0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
2a3f0 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20  e same.  In the 
2a400 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20  places where.** 
2a410 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2a420 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f  used, it does no
2a430 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e  t hurt to get an
2a440 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a   extra 2 - that.
2a450 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65  ** just might re
2a460 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69  sult in some sli
2a470 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64  ghtly slower cod
2a480 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e  e.  But returnin
2a490 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63  g.** an incorrec
2a4a0 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c  t 0 or 1 could l
2a4b0 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63  ead to a malfunc
2a4c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  tion..**.** If p
2a4d0 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c  Parse is not NUL
2a4e0 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52 49 41 42  L then TK_VARIAB
2a4f0 4c 45 20 74 65 72 6d 73 20 69 6e 20 70 41 20 77  LE terms in pA w
2a500 69 74 68 20 62 69 6e 64 69 6e 67 73 20 69 6e 0a  ith bindings in.
2a510 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72  ** pParse->pRepr
2a520 65 70 61 72 65 20 63 61 6e 20 62 65 20 6d 61 74  epare can be mat
2a530 63 68 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74  ched against lit
2a540 65 72 61 6c 73 20 69 6e 20 70 42 2e 20 20 54 68  erals in pB.  Th
2a550 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 56  e .** pParse->pV
2a560 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 62 69 74  dbe->expmask bit
2a570 6d 61 73 6b 20 69 73 20 75 70 64 61 74 65 64 20  mask is updated 
2a580 66 6f 72 20 65 61 63 68 20 76 61 72 69 61 62 6c  for each variabl
2a590 65 20 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  e referenced..**
2a5a0 20 49 66 20 70 50 61 72 73 65 20 69 73 20 4e 55   If pParse is NU
2a5b0 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61 6c 20 63  LL (the normal c
2a5c0 61 73 65 29 20 74 68 65 6e 20 61 6e 79 20 54 4b  ase) then any TK
2a5d0 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 20 69  _VARIABLE term i
2a5e0 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  n .** Argument p
2a5f0 50 61 72 73 65 20 73 68 6f 75 6c 64 20 6e 6f 72  Parse should nor
2a600 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e 20 49  mally be NULL. I
2a610 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
2a620 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a 20 70 42   and pA or.** pB
2a630 20 63 61 75 73 65 73 20 61 20 72 65 74 75 72 6e   causes a return
2a640 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a   value of 2..*/.
2a650 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
2a660 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70 50  ompare(Parse *pP
2a670 61 72 73 65 2c 20 45 78 70 72 20 2a 70 41 2c 20  arse, Expr *pA, 
2a680 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54  Expr *pB, int iT
2a690 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69  ab){.  u32 combi
2a6a0 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  nedFlags;.  if( 
2a6b0 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
2a6c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
2a6d0 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d  =pA ? 0 : 2;.  }
2a6e0 0a 20 20 69 66 28 20 70 50 61 72 73 65 20 26 26  .  if( pParse &&
2a6f0 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49   pA->op==TK_VARI
2a700 41 42 4c 45 20 26 26 20 65 78 70 72 43 6f 6d 70  ABLE && exprComp
2a710 61 72 65 56 61 72 69 61 62 6c 65 28 70 50 61 72  areVariable(pPar
2a720 73 65 2c 20 70 41 2c 20 70 42 29 20 29 7b 0a 20  se, pA, pB) ){. 
2a730 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2a740 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  .  combinedFlags
2a750 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70   = pA->flags | p
2a760 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  B->flags;.  if( 
2a770 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
2a780 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
2a790 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67     if( (pA->flag
2a7a0 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49  s&pB->flags&EP_I
2a7b0 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70  ntValue)!=0 && p
2a7c0 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d  A->u.iValue==pB-
2a7d0 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  >u.iValue ){.   
2a7e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2a7f0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
2a800 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
2a810 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20  p!=pB->op ){.   
2a820 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
2a830 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
2a840 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2a850 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c  arse, pA->pLeft,
2a860 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20  pB,iTab)<2 ){.  
2a870 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2a880 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e    }.    if( pB->
2a890 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
2a8a0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
2a8b0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2c  pare(pParse, pA,
2a8c0 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29 3c  pB->pLeft,iTab)<
2a8d0 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
2a8e0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 1;.    }.    r
2a8f0 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
2a900 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  f( pA->op!=TK_CO
2a910 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d  LUMN && pA->op!=
2a920 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26  TK_AGG_COLUMN &&
2a930 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
2a940 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
2a950 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  =TK_FUNCTION ){.
2a960 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2a970 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a  3StrICmp(pA->u.z
2a980 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
2a990 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  en)!=0 ) return 
2a9a0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
2a9b0 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
2a9c0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
2a9d0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
2a9e0 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42  (pA->u.zToken,pB
2a9f0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29  ->u.zToken)!=0 )
2aa00 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
2aa10 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
2aa20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
2aa30 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  >u.zToken)!=0 ){
2aa40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
2aa50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2aa60 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
2aa70 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d  _Distinct)!=(pB-
2aa80 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
2aa90 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32  inct) ) return 2
2aaa0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 28  ;.  if( ALWAYS((
2aab0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
2aac0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30  EP_TokenOnly)==0
2aad0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d  ) ){.    if( com
2aae0 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
2aaf0 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74 75  xIsSelect ) retu
2ab00 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
2ab10 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2ab20 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65  (pParse, pA->pLe
2ab30 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  ft, pB->pLeft, i
2ab40 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
2ab50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2ab60 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2ab70 73 65 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c 20  se, pA->pRight, 
2ab80 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pB->pRight, iTab
2ab90 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
2aba0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2abb0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d  rListCompare(pA-
2abc0 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e  >x.pList, pB->x.
2abd0 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72  pList, iTab) ) r
2abe0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 61 73 73  eturn 2;.    ass
2abf0 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c  ert( (combinedFl
2ac00 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64  ags & EP_Reduced
2ac10 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
2ac20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e  pA->op!=TK_STRIN
2ac30 47 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f  G && pA->op!=TK_
2ac40 54 52 55 45 46 41 4c 53 45 20 29 7b 0a 20 20 20  TRUEFALSE ){.   
2ac50 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75     if( pA->iColu
2ac60 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
2ac70 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2ac80 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
2ac90 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
2aca0 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61       && (pA->iTa
2acb0 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56  ble!=iTab || NEV
2acc0 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30  ER(pB->iTable>=0
2acd0 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  )) ) return 2;. 
2ace0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2acf0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
2ad00 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69  mpare two ExprLi
2ad10 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74  st objects.  Ret
2ad20 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72  urn 0 if they ar
2ad30 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
2ad40 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
2ad50 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
2ad60 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  ny way..**.** If
2ad70 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
2ad80 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
2ad90 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
2ada0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
2adb0 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
2adc0 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
2add0 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
2ade0 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
2adf0 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
2ae00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
2ae10 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
2ae20 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
2ae30 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
2ae40 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
2ae50 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
2ae60 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
2ae70 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
2ae80 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
2ae90 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
2aea0 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
2aeb0 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
2aec0 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
2aed0 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
2aee0 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
2aef0 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
2af00 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
2af10 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
2af20 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
2af30 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
2af40 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
2af50 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
2af60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2af70 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
2af80 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
2af90 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69  rList *pB, int i
2afa0 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Tab){.  int i;. 
2afb0 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42   if( pA==0 && pB
2afc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2afd0 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
2afe0 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  B==0 ) return 1;
2aff0 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72  .  if( pA->nExpr
2b000 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65  !=pB->nExpr ) re
2b010 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d  turn 1;.  for(i=
2b020 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20  0; i<pA->nExpr; 
2b030 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
2b040 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69  pExprA = pA->a[i
2b050 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
2b060 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
2b070 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
2b080 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72  if( pA->a[i].sor
2b090 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d  tOrder!=pB->a[i]
2b0a0 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
2b0b0 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73  urn 1;.    if( s
2b0c0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2b0d0 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78  e(0, pExprA, pEx
2b0e0 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74  prB, iTab) ) ret
2b0f0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2b100 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2b110 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
2b120 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74  Compare() except
2b130 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
2b140 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65  rs at the top-le
2b150 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72  vel.** are ignor
2b160 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2b170 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2b180 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  p(Expr *pA, Expr
2b190 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
2b1a0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2b1b0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a  3ExprCompare(0,.
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2b1d0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2b1e0 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20 20  ate(pA),.       
2b1f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2b200 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42 29  rSkipCollate(pB)
2b210 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
2b220 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Tab);.}../*.** R
2b230 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65  eturn true if we
2b240 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70   can prove the p
2b250 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  E2 will always b
2b260 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73  e true if pE1 is
2b270 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72  .** true.  Retur
2b280 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61  n false if we ca
2b290 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68  nnot complete th
2b2a0 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45  e proof or if pE
2b2b0 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61  2 might.** be fa
2b2c0 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  lse.  Examples:.
2b2d0 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  **.**     pE1: x
2b2e0 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78  ==5       pE2: x
2b2f0 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
2b300 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2b310 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20      pE1: x>0    
2b320 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
2b330 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
2b340 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
2b350 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70  E1: x=21       p
2b360 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33  E2: x=21 OR y=43
2b370 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
2b380 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
2b390 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20  =123     pE2: x 
2b3a0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2b3b0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2b3c0 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20     pE1: x!=?1   
2b3d0 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
2b3e0 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
2b3f0 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
2b400 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32  : x IS NULL  pE2
2b410 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2b420 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
2b430 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
2b440 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49  S ?2    pE2: x I
2b450 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2b460 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a  uslt: false.**.*
2b470 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  * When comparing
2b480 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2b490 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64   between pE1 and
2b4a0 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73   pE2, if pE2 has
2b4b0 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c  .** Expr.iTable<
2b4c0 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20  0 then assume a 
2b4d0 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76  table number giv
2b4e0 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a  en by iTab..**.*
2b4f0 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e  * If pParse is n
2b500 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
2b510 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e  e values of boun
2b520 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 70  d variables in p
2b530 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70 61  E1 are .** compa
2b540 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65  red against lite
2b550 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70 45  ral values in pE
2b560 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70 56  2 and pParse->pV
2b570 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73 0a  dbe->expmask is.
2b580 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 72  ** modified to r
2b590 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75 6e  ecord which boun
2b5a0 64 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  d variables are 
2b5b0 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66 20  referenced.  If 
2b5c0 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e 55  pParse .** is NU
2b5d0 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20 77  LL, then false w
2b5e0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
2b5f0 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73 20  if pE1 contains 
2b600 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61 62  any bound variab
2b610 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  les..**.** When 
2b620 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
2b630 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
2b640 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
2b650 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
2b660 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
2b670 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
2b680 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
2b690 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
2b6a0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
2b6b0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
2b6c0 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
2b6d0 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
2b6e0 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
2b6f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2b700 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61 72  rImpliesExpr(Par
2b710 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2b720 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32   *pE1, Expr *pE2
2b730 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
2b740 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2b750 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
2b760 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30  1, pE2, iTab)==0
2b770 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2b780 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d  ;.  }.  if( pE2-
2b790 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26  >op==TK_OR.   &&
2b7a0 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70   (sqlite3ExprImp
2b7b0 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c  liesExpr(pParse,
2b7c0 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74   pE1, pE2->pLeft
2b7d0 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20  , iTab).        
2b7e0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45       || sqlite3E
2b7f0 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
2b800 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2b810 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
2b820 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2b830 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
2b840 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  2->op==TK_NOTNUL
2b850 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
2b860 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
2b870 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20  op!=TK_IS ){.   
2b880 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69   Expr *pX = sqli
2b890 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2b8a0 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a  te(pE1->pLeft);.
2b8b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2b8c0 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a  !=pE1->pLeft );.
2b8d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2b8e0 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2b8f0 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66  e, pX, pE2->pLef
2b900 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65  t, iTab)==0 ) re
2b910 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2b920 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2b930 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78 70   This is the Exp
2b940 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20  r node callback 
2b950 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72 49  for sqlite3ExprI
2b960 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2b970 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ()..** If the ex
2b980 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
2b990 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20  quires that the 
2b9a0 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65 72  table at pWalker
2b9b0 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20 61  ->iCur.** have a
2b9c0 20 6e 6f 6e 2d 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   non-NULL column
2b9d0 2c 20 74 68 65 6e 20 73 65 74 20 70 57 61 6c 6b  , then set pWalk
2b9e0 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20 61  er->eCode to 1 a
2b9f0 6e 64 20 61 62 6f 72 74 2e 0a 2a 2f 0a 73 74 61  nd abort..*/.sta
2ba00 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73 4e  tic int impliesN
2ba10 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65 72  otNullRow(Walker
2ba20 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2ba30 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68  *pExpr){.  /* Th
2ba40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
2ba50 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 57 48  ly called for WH
2ba60 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
2ba70 73 73 69 6f 6e 73 20 61 6e 64 20 73 6f 20 69 74  ssions and so it
2ba80 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 68 61 76  .  ** cannot hav
2ba90 65 20 61 6e 79 20 54 4b 5f 41 47 47 5f 43 4f 4c  e any TK_AGG_COL
2baa0 55 4d 4e 20 65 6e 74 72 69 65 73 20 62 65 63 61  UMN entries beca
2bab0 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 6f 6e  use those are on
2bac0 6c 79 20 66 6f 75 6e 64 0a 20 20 2a 2a 20 69 6e  ly found.  ** in
2bad0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 2e   HAVING clauses.
2bae0 20 20 57 65 20 63 61 6e 20 67 65 74 20 61 20 54    We can get a T
2baf0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 69  K_AGG_FUNCTION i
2bb00 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
2bb10 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20  ,.  ** but that 
2bb20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 20 63 6f  is an illegal co
2bb30 6e 73 74 72 75 63 74 20 61 6e 64 20 74 68 65 20  nstruct and the 
2bb40 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 72 65  query will be re
2bb50 6a 65 63 74 65 64 20 61 74 0a 20 20 2a 2a 20 61  jected at.  ** a
2bb60 20 6c 61 74 65 72 20 73 74 61 67 65 20 6f 66 20   later stage of 
2bb70 70 72 6f 63 65 73 73 69 6e 67 2c 20 73 6f 20 74  processing, so t
2bb80 68 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  he TK_AGG_FUNCTI
2bb90 4f 4e 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  ON case does not
2bba0 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  .  ** need to be
2bbb0 20 63 6f 6e 73 69 64 65 72 65 64 20 68 65 72 65   considered here
2bbc0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
2bbd0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
2bbe0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74 65 73  _COLUMN );.  tes
2bbf0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2bc00 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
2bc10 4e 20 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72  N );..  if( Expr
2bc20 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2bc30 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
2bc40 29 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75  ) return WRC_Pru
2bc50 6e 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  ne;.  switch( pE
2bc60 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
2bc70 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
2bc80 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a 20    case TK_NOT:. 
2bc90 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
2bca0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  L:.    case TK_I
2bcb0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  S:.    case TK_O
2bcc0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  R:.    case TK_C
2bcd0 41 53 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASE:.    case TK
2bce0 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IN:.    case TK
2bcf0 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
2bd00 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2bd10 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
2bd20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2bd30 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2bd40 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  NOT );.      tes
2bd50 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2bd60 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
2bd70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2bd80 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
2bd90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2bda0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2bdb0 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _OR );.      tes
2bdc0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2bdd0 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20 20 20  ==TK_CASE );.   
2bde0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2bdf0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
2be00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2be10 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46   pExpr->op==TK_F
2be20 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
2be30 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2be40 65 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  e;.    case TK_C
2be50 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 69 66 28  OLUMN:.      if(
2be60 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72   pWalker->u.iCur
2be70 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
2be80 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  ){.        pWalk
2be90 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20  er->eCode = 1;. 
2bea0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2beb0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
2bec0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2bed0 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20 2f 2a  C_Prune;..    /*
2bee0 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   Virtual tables 
2bef0 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75  are allowed to u
2bf00 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6c  se constraints l
2bf10 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53 6f 0a  ike x=NULL.  So.
2bf20 20 20 20 20 2a 2a 20 61 20 74 65 72 6d 20 6f 66      ** a term of
2bf30 20 74 68 65 20 66 6f 72 6d 20 78 3d 79 20 64 6f   the form x=y do
2bf40 65 73 20 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  es not prove tha
2bf50 74 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20  t y is not null 
2bf60 69 66 20 78 0a 20 20 20 20 2a 2a 20 69 73 20 74  if x.    ** is t
2bf70 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 76  he column of a v
2bf80 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
2bf90 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a      case TK_EQ:.
2bfa0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
2bfb0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
2bfc0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
2bfd0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
2bfe0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
2bff0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c000 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
2c010 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c020 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c030 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_NE );.      te
2c040 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c050 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
2c060 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2c070 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  r->op==TK_LE );.
2c080 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c090 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  pExpr->op==TK_GT
2c0a0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c0b0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c0c0 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 69 66  K_GE );.      if
2c0d0 28 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  ( (pExpr->pLeft-
2c0e0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
2c0f0 26 20 49 73 56 69 72 74 75 61 6c 28 70 45 78 70  & IsVirtual(pExp
2c100 72 2d 3e 70 4c 65 66 74 2d 3e 70 54 61 62 29 29  r->pLeft->pTab))
2c110 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70  .       || (pExp
2c120 72 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  r->pRight->op==T
2c130 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69  K_COLUMN && IsVi
2c140 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 52 69  rtual(pExpr->pRi
2c150 67 68 74 2d 3e 70 54 61 62 29 29 0a 20 20 20 20  ght->pTab)).    
2c160 20 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74 75    ){.       retu
2c170 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2c180 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
2c190 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
2c1a0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
2c1b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
2c1c0 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f  n true (non-zero
2c1d0 29 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20  ) if expression 
2c1e0 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72  p can only be tr
2c1f0 75 65 20 69 66 20 61 74 20 6c 65 61 73 74 0a 2a  ue if at least.*
2c200 2a 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  * one column of 
2c210 74 61 62 6c 65 20 69 54 61 62 20 69 73 20 6e 6f  table iTab is no
2c220 6e 2d 6e 75 6c 6c 2e 20 20 49 6e 20 6f 74 68 65  n-null.  In othe
2c230 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
2c240 74 72 75 65 0a 2a 2a 20 69 66 20 65 78 70 72 65  true.** if expre
2c250 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 61 6c 77  ssion p will alw
2c260 61 79 73 20 62 65 20 4e 55 4c 4c 20 6f 72 20 66  ays be NULL or f
2c270 61 6c 73 65 20 69 66 20 65 76 65 72 79 20 63 6f  alse if every co
2c280 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20  lumn of iTab.** 
2c290 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46  is NULL..**.** F
2c2a0 61 6c 73 65 20 6e 65 67 61 74 69 76 65 73 20 61  alse negatives a
2c2b0 72 65 20 61 63 63 65 70 74 61 62 6c 65 2e 20 20  re acceptable.  
2c2c0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2c2d0 69 74 20 69 73 20 6f 6b 20 74 6f 20 72 65 74 75  it is ok to retu
2c2e0 72 6e 0a 2a 2a 20 7a 65 72 6f 20 65 76 65 6e 20  rn.** zero even 
2c2f0 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  if expression p 
2c300 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72  will never be tr
2c310 75 65 20 6f 66 20 65 76 65 72 79 20 63 6f 6c 75  ue of every colu
2c320 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73  mn of iTab.** is
2c330 20 4e 55 4c 4c 2e 20 20 41 20 66 61 6c 73 65 20   NULL.  A false 
2c340 6e 65 67 61 74 69 76 65 20 69 73 20 6d 65 72 65  negative is mere
2c350 6c 79 20 61 20 6d 69 73 73 65 64 20 6f 70 74 69  ly a missed opti
2c360 6d 69 7a 61 74 69 6f 6e 20 6f 70 70 6f 72 74 75  mization opportu
2c370 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73  nity..**.** Fals
2c380 65 20 70 6f 73 69 74 69 76 65 73 20 61 72 65 20  e positives are 
2c390 6e 6f 74 20 61 6c 6c 6f 77 65 64 2c 20 68 6f 77  not allowed, how
2c3a0 65 76 65 72 2e 20 20 41 20 66 61 6c 73 65 20 70  ever.  A false p
2c3b0 6f 73 69 74 69 76 65 20 6d 61 79 20 72 65 73 75  ositive may resu
2c3c0 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 63 6f  lt.** in an inco
2c3d0 72 72 65 63 74 20 61 6e 73 77 65 72 2e 0a 2a 2a  rrect answer..**
2c3e0 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 70 20 74  .** Terms of p t
2c3f0 68 61 74 20 61 72 65 20 6d 61 72 6b 65 64 20 77  hat are marked w
2c400 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  ith EP_FromJoin 
2c410 28 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20  (and hence that 
2c420 63 6f 6d 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  come from.** the
2c430 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2c440 75 73 65 73 20 6f 66 20 4c 45 46 54 20 4a 4f 49  uses of LEFT JOI
2c450 4e 53 29 20 61 72 65 20 65 78 63 6c 75 64 65 64  NS) are excluded
2c460 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 73   from the analys
2c470 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  is..**.** This r
2c480 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
2c490 6f 20 63 68 65 63 6b 20 69 66 20 61 20 4c 45 46  o check if a LEF
2c4a0 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 63 6f  T JOIN can be co
2c4b0 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 2a 2a 20  nverted into.** 
2c4c0 61 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e  an ordinary JOIN
2c4d0 2e 20 20 54 68 65 20 70 20 61 72 67 75 6d 65 6e  .  The p argumen
2c4e0 74 20 69 73 20 74 68 65 20 57 48 45 52 45 20 63  t is the WHERE c
2c4f0 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 57  lause.  If the W
2c500 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 72  HERE.** clause r
2c510 65 71 75 69 72 65 73 20 74 68 61 74 20 73 6f 6d  equires that som
2c520 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
2c530 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74  right table of t
2c540 68 65 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20  he LEFT JOIN.** 
2c550 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  be non-NULL, the
2c560 6e 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20  n the LEFT JOIN 
2c570 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63 6f  can be safely co
2c580 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 0a  nverted into an.
2c590 2a 2a 20 6f 72 64 69 6e 61 72 79 20 6a 6f 69 6e  ** ordinary join
2c5a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2c5b0 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75  ExprImpliesNonNu
2c5c0 6c 6c 52 6f 77 28 45 78 70 72 20 2a 70 2c 20 69  llRow(Expr *p, i
2c5d0 6e 74 20 69 54 61 62 29 7b 0a 20 20 57 61 6c 6b  nt iTab){.  Walk
2c5e0 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
2c5f0 61 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65  allback = implie
2c600 73 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77  sNotNullRow;.  w
2c610 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2c620 20 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63   = 0;.  w.xSelec
2c630 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a  tCallback2 = 0;.
2c640 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20    w.eCode = 0;. 
2c650 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 54 61 62   w.u.iCur = iTab
2c660 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2c670 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
2c680 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a  turn w.eCode;.}.
2c690 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2c6a0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2c6b0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2c6c0 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
2c6d0 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64  e walker.** to d
2c6e0 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65  etermine if an e
2c6f0 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
2c700 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65   evaluated by re
2c710 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a  ference to the.*
2c720 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69  * index only, wi
2c730 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
2c740 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  do a search for 
2c750 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2c760 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79  g.** table entry
2c770 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e  .  The IdxCover.
2c780 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68  pIdx field is th
2c790 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76  e index.  IdxCov
2c7a0 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68  er.iCur.** is th
2c7b0 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  e cursor for the
2c7c0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
2c7d0 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49  t IdxCover {.  I
2c7e0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
2c7f0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
2c800 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f  be tested for co
2c810 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  verage */.  int 
2c820 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  iCur;        /* 
2c830 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
2c840 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72  r the table corr
2c850 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
2c860 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   index */.};../*
2c870 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
2c880 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65   if there are re
2c890 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2c8a0 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a  mns in table .**
2c8b0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
2c8c0 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20  Cover->iCur can 
2c8d0 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69  be satisfied usi
2c8e0 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  ng the index.** 
2c8f0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2c900 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73  over->pIdx..*/.s
2c910 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64  tatic int exprId
2c920 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70  xCover(Walker *p
2c930 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2c940 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
2c950 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2c960 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54  .   && pExpr->iT
2c970 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
2c980 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
2c990 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f  .   && sqlite3Co
2c9a0 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c  lumnOfIndex(pWal
2c9b0 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2c9c0 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69  ->pIdx, pExpr->i
2c9d0 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20  Column)<0.  ){. 
2c9e0 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2c9f0 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  e = 1;.    retur
2ca00 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
2ca10 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2ca20 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
2ca30 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
2ca40 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74   index pIdx on t
2ca50 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
2ca60 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77   iCur contains w
2ca70 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  ill.** the expre
2ca80 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
2ca90 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
2caa0 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65   index does cove
2cab0 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  r the.** express
2cac0 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ion and false if
2cad0 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
2cae0 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73  ssion references
2caf0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a   table columns.*
2cb00 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66  * that are not f
2cb10 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65  ound in the inde
2cb20 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e  x pIdx..**.** An
2cb30 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20   index covering 
2cb40 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65  an expression me
2cb50 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70  ans that the exp
2cb60 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a  ression can be.*
2cb70 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e  * evaluated usin
2cb80 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78  g only the index
2cb90 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76   and without hav
2cba0 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  ing to lookup th
2cbb0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
2cbc0 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a  ng table entry..
2cbd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2cbe0 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78  prCoveredByIndex
2cbf0 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  (.  Expr *pExpr,
2cc00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
2cc10 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65  ndex to be teste
2cc20 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
2cc30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2cc40 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
2cc50 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
2cc60 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  nding table */. 
2cc70 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
2cc80 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2cc90 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  x that might be 
2cca0 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  used for coverag
2ccb0 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  e */.){.  Walker
2ccc0 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78   w;.  struct Idx
2ccd0 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65  Cover xcov;.  me
2cce0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
2ccf0 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69  of(w));.  xcov.i
2cd00 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63  Cur = iCur;.  xc
2cd10 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  ov.pIdx = pIdx;.
2cd20 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2cd30 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72  k = exprIdxCover
2cd40 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65  ;.  w.u.pIdxCove
2cd50 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c  r = &xcov;.  sql
2cd60 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
2cd70 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72   pExpr);.  retur
2cd80 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a  n !w.eCode;.}...
2cd90 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
2cda0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2cdb0 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
2cdc0 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
2cdd0 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f   walker.** to co
2cde0 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  unt references t
2cdf0 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  o table columns 
2ce00 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  in the arguments
2ce10 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65   of an .** aggre
2ce20 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69  gate function, i
2ce30 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65  n order to imple
2ce40 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ment the.** sqli
2ce50 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53  te3FunctionThisS
2ce60 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  rc() routine..*/
2ce70 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74  .struct SrcCount
2ce80 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53   {.  SrcList *pS
2ce90 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72  rc;   /* One par
2cea0 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61  ticular FROM cla
2ceb0 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20  use in a nested 
2cec0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  query */.  int n
2ced0 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  This;       /* N
2cee0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2cef0 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
2cf00 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  n pSrcList */.  
2cf10 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20  int nOther;     
2cf20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2cf30 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2cf40 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f  mns in other FRO
2cf50 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a  M clauses */.};.
2cf60 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
2cf70 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
2cf80 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2cf90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cfa0 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c  exprSrcCount(Wal
2cfb0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2cfc0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a  pr *pExpr){.  /*
2cfd0 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20   The NEVER() on 
2cfe0 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20  the second term 
2cff0 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74  is because sqlit
2d000 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
2d010 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20  isSrc().  ** is 
2d020 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65  always called be
2d030 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72  fore sqlite3Expr
2d040 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2d050 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20  s() and so the. 
2d060 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68   ** TK_COLUMNs h
2d070 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
2d080 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
2d090 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20  TK_AGG_COLUMN.  
2d0a0 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  If.  ** sqlite3F
2d0b0 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2d0c0 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66  rc() is used dif
2d0d0 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  ferently in the 
2d0e0 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a  future, the.  **
2d0f0 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65   NEVER() will ne
2d100 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64  ed to be removed
2d110 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  . */.  if( pExpr
2d120 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2d130 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e  || NEVER(pExpr->
2d140 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2d150 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  N) ){.    int i;
2d160 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43  .    struct SrcC
2d170 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65  ount *p = pWalke
2d180 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a  r->u.pSrcCount;.
2d190 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
2d1a0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
2d1b0 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63   int nSrc = pSrc
2d1c0 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20   ? pSrc->nSrc : 
2d1d0 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
2d1e0 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSrc; i++){.  
2d1f0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2d200 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69  Table==pSrc->a[i
2d210 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ].iCursor ) brea
2d220 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
2d230 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20   i<nSrc ){.     
2d240 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20   p->nThis++;.   
2d250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
2d260 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d  >nOther++;.    }
2d270 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2d280 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2d290 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
2d2a0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67  f any of the arg
2d2b0 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45  uments to the pE
2d2c0 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66  xpr Function ref
2d2d0 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69  erence.** pSrcLi
2d2e0 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  st.  Return true
2d2f0 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c   if they do.  Al
2d300 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
2d310 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  f the function.*
2d320 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e  * has no argumen
2d330 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63  ts or has only c
2d340 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
2d350 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  s.  Return false
2d360 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66   if pExpr.** ref
2d370 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20  erences columns 
2d380 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20  but not columns 
2d390 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20  of tables found 
2d3a0 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  in pSrcList..*/.
2d3b0 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74  int sqlite3Funct
2d3c0 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45  ionUsesThisSrc(E
2d3d0 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c  xpr *pExpr, SrcL
2d3e0 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a  ist *pSrcList){.
2d3f0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
2d400 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e  ruct SrcCount cn
2d410 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  t;.  assert( pEx
2d420 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
2d430 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78  UNCTION );.  w.x
2d440 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
2d450 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77  xprSrcCount;.  w
2d460 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2d470 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63   = 0;.  w.u.pSrc
2d480 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20  Count = &cnt;.  
2d490 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c  cnt.pSrc = pSrcL
2d4a0 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73  ist;.  cnt.nThis
2d4b0 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68   = 0;.  cnt.nOth
2d4c0 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
2d4d0 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77  3WalkExprList(&w
2d4e0 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
2d4f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e  );.  return cnt.
2d500 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e  nThis>0 || cnt.n
2d510 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Other==0;.}../*.
2d520 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
2d530 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
2d540 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
2d550 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
2d560 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
2d570 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
2d580 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2d590 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
2d5a0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2d5b0 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
2d5c0 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a  Column(sqlite3 *
2d5d0 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
2d5e0 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
2d5f0 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
2d600 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
2d610 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20  te(.       db,. 
2d620 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
2d630 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  l,.       sizeof
2d640 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29  (pInfo->aCol[0])
2d650 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
2d660 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
2d670 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
2d680 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
2d690 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
2d6a0 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
2d6b0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
2d6c0 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
2d6d0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
2d6e0 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
2d6f0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2d700 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
2d710 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2d720 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
2d730 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62  Func(sqlite3 *db
2d740 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
2d750 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
2d760 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c  nfo->aFunc = sql
2d770 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
2d780 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20  e(.       db, . 
2d790 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75        pInfo->aFu
2d7a0 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  nc,.       sizeo
2d7b0 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
2d7c0 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
2d7d0 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->nFunc,.      
2d7e0 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
2d7f0 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
2d800 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
2d810 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  xprCallback for 
2d820 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20  a tree walker.  
2d830 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  It is used to.**
2d840 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
2d850 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2d860 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
2d870 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2d880 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
2d890 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
2d8a0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
2d8b0 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
2d8c0 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65  eAggregate(Walke
2d8d0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2d8e0 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
2d8f0 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
2d900 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
2d910 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  >u.pNC;.  Parse 
2d920 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
2d930 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
2d940 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
2d950 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
2d960 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
2d970 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49  = pNC->uNC.pAggI
2d980 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  nfo;..  assert( 
2d990 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
2d9a0 43 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20  C_UAggInfo );.  
2d9b0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
2d9c0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
2d9d0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
2d9e0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
2d9f0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
2da00 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2da10 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
2da20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2da30 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
2da40 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  UMN );.      /* 
2da50 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2da60 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
2da70 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
2da80 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
2da90 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
2daa0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2dab0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
2dac0 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69  f( ALWAYS(pSrcLi
2dad0 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
2dae0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2daf0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
2db00 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
2db10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2db20 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
2db30 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2db40 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2db50 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
2db60 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2db70 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2db80 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
2db90 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2dba0 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
2dbb0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
2dbc0 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
2dbd0 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
2dbe0 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
2dbf0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
2dc00 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70   means that pExp
2dc10 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  r refers to a ta
2dc20 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
2dc30 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  ** that is in th
2dc40 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2dc50 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
2dc60 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20  uery.  .        
2dc70 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
2dc80 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     ** Make an en
2dc90 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  try for the colu
2dca0 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  mn in pAggInfo->
2dcb0 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a  aCol[] if there.
2dcc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2dcd0 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74  s not an entry t
2dce0 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
2dcf0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2dd00 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
2dd10 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2dd20 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f   = pAggInfo->aCo
2dd30 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  l;.            f
2dd40 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e  or(k=0; k<pAggIn
2dd50 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  fo->nColumn; k++
2dd60 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
2dd70 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
2dd80 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  l->iTable==pExpr
2dd90 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
2dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2ddb0 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  ol->iColumn==pEx
2ddc0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
2ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2dde0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2ddf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2de00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2de10 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f  if( (k>=pAggInfo
2de20 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20  ->nColumn).     
2de30 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20          && (k = 
2de40 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
2de50 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
2de60 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20  gInfo))>=0 .    
2de70 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2de80 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
2de90 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
2dea0 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k];.            
2deb0 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70    pCol->pTab = p
2dec0 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
2ded0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2dee0 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  iTable = pExpr->
2def0 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
2df00 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
2df10 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
2df20 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
2df30 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d      pCol->iMem =
2df40 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2df50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2df60 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2df70 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
2df80 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78         pCol->pEx
2df90 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
2dfa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
2dfb0 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
2dfc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dfd0 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20      int j, n;.  
2dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
2dff0 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41  prList *pGB = pA
2e000 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
2e010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e020 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2e030 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20  t_item *pTerm = 
2e040 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  pGB->a;.        
2e050 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d          n = pGB-
2e060 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
2e070 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
2e080 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d   j<n; j++, pTerm
2e090 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2e0a0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
2e0b0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0d0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
2e0e0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69  _COLUMN && pE->i
2e0f0 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
2e100 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
2e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2e120 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
2e130 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
2e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e150 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2e160 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
2e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2e180 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2e190 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e1a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e1b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e1c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
2e1d0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2e1e0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2e1f0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
2e200 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67  terColumn = pAgg
2e210 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f  Info->nSortingCo
2e220 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
2e230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e250 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
2e260 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70  w an entry for p
2e270 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f  Expr in pAggInfo
2e280 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72  ->aCol[] (either
2e290 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2e2a0 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74  because it was t
2e2b0 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62  here before or b
2e2c0 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63  ecause we just c
2e2d0 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20  reated it)..    
2e2e0 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65          ** Conve
2e2f0 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20  rt the pExpr to 
2e300 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  be a TK_AGG_COLU
2e310 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20  MN referring to 
2e320 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20  that.           
2e330 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   ** pAggInfo->aC
2e340 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20  ol[] entry..    
2e350 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e360 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2e370 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2e380 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2e390 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2e3a0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
2e3b0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  gInfo;.         
2e3c0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
2e3d0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20  K_AGG_COLUMN;.  
2e3e0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2e3f0 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a  >iAgg = (i16)k;.
2e400 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2e410 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f  k;.          } /
2e420 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69  * endif pExpr->i
2e430 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
2e440 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  ursor */.       
2e450 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f   } /* end loop o
2e460 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a  ver pSrcList */.
2e470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2e480 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2e490 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
2e4a0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
2e4b0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43  {.      if( (pNC
2e4c0 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49  ->ncFlags & NC_I
2e4d0 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20  nAggFunc)==0.   
2e4e0 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e      && pWalker->
2e4f0 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78  walkerDepth==pEx
2e500 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b  pr->op2.      ){
2e510 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
2e520 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
2e530 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
2e540 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
2e550 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
2e560 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
2e570 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
2e580 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
2e590 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
2e5a0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2e5b0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
2e5c0 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
2e5d0 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
2e5e0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
2e5f0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
2e600 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2e610 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2e620 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74  prCompare(0, pIt
2e630 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72  em->pExpr, pExpr
2e640 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , -1)==0 ){.    
2e650 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2e660 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e670 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2e680 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46   i>=pAggInfo->nF
2e690 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unc ){.         
2e6a0 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69   /* pExpr is ori
2e6b0 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e  ginal.  Make a n
2e6c0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67  ew entry in pAgg
2e6d0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20  Info->aFunc[].  
2e6e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e6f0 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
2e700 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  C(pParse->db);. 
2e710 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64           i = add
2e720 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72  AggInfoFunc(pPar
2e730 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
2e740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2e750 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i>=0 ){.       
2e760 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2e770 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2e780 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
2e790 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t) );.          
2e7a0 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49    pItem = &pAggI
2e7b0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20  nfo->aFunc[i];. 
2e7c0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2e7d0 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
2e7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2e7f0 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  em->iMem = ++pPa
2e800 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2e810 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2e820 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2e830 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
2e840 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ue) );.         
2e850 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20     pItem->pFunc 
2e860 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
2e870 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
2e880 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e890 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54       pExpr->u.zT
2e8a0 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  oken, .         
2e8b0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2e8c0 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  >x.pList ? pExpr
2e8d0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2e8e0 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
2e8f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2e900 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
2e910 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
2e920 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2e930 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
2e940 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2e950 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2e960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2e970 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
2e980 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
2e990 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2e9a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e9b0 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
2e9c0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
2e9d0 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
2e9e0 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
2e9f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2ea00 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2ea10 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2ea20 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
2ea30 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2ea40 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
2ea50 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
2ea60 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2ea70 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2ea80 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20  Agg = (i16)i;.  
2ea90 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
2eaa0 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
2eab0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2eac0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
2ead0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2eae0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2eaf0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
2eb00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2eb10 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2eb20 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
2eb30 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2eb40 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57  elect(Walker *pW
2eb50 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
2eb60 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45  Select){.  UNUSE
2eb70 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c  D_PARAMETER(pSel
2eb80 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  ect);.  pWalker-
2eb90 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a  >walkerDepth++;.
2eba0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2ebb0 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
2ebc0 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72  void analyzeAggr
2ebd0 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e  egatesInSelectEn
2ebe0 64 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  d(Walker *pWalke
2ebf0 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
2ec00 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ct){.  UNUSED_PA
2ec10 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29  RAMETER(pSelect)
2ec20 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c  ;.  pWalker->wal
2ec30 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f  kerDepth--;.}../
2ec40 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
2ec50 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f   pExpr expressio
2ec60 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
2ec70 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2ec80 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
2ec90 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
2eca0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
2ecb0 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74  AggInfo object t
2ecc0 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  hat pNC->pAggInf
2ecd0 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20  o.** points to. 
2ece0 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   Additional entr
2ecf0 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20  ies are made on 
2ed00 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65  the AggInfo obje
2ed10 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61  ct as.** necessa
2ed20 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
2ed30 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
2ed40 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
2ed50 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
2ed60 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
2ed70 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
2ed80 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
2ed90 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
2eda0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2edb0 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
2edc0 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
2edd0 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b   *pExpr){.  Walk
2ede0 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
2edf0 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
2ee00 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e  eAggregate;.  w.
2ee10 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2ee20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
2ee30 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77  tesInSelect;.  w
2ee40 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2ee50 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  2 = analyzeAggre
2ee60 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64  gatesInSelectEnd
2ee70 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74  ;.  w.walkerDept
2ee80 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43  h = 0;.  w.u.pNC
2ee90 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74   = pNC;.  assert
2eea0 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
2eeb0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  =0 );.  sqlite3W
2eec0 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
2eed0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  r);.}../*.** Cal
2eee0 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
2eef0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
2ef00 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
2ef10 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
2ef20 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
2ef30 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
2ef40 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
2ef50 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2ef60 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
2ef70 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
2ef80 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
2ef90 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2efa0 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
2efb0 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
2efc0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
2efd0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2efe0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
2eff0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
2f000 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
2f010 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
2f020 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
2f030 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2f040 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2f050 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2f060 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
2f070 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
2f080 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2f090 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65   a single new re
2f0a0 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74  gister for use t
2f0b0 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65  o hold some inte
2f0c0 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e  rmediate result.
2f0d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
2f0e0 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
2f0f0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
2f100 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2f110 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2f120 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
2f130 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2f140 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2f150 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
2f160 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  eg];.}../*.** De
2f170 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
2f180 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69  ter, making avai
2f190 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20  lable for reuse 
2f1a0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  for some other.*
2f1b0 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  * purpose..**.**
2f1c0 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
2f1d0 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  s currently bein
2f1e0 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  g used by the co
2f1f0 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  lumn cache, then
2f200 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c 6f 63 61  .** the dealloca
2f210 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64  tion is deferred
2f220 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d   until the colum
2f230 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61  n cache line tha
2f240 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65  t uses.** the re
2f250 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73  gister becomes s
2f260 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tale..*/.void sq
2f270 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2f280 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
2f290 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
2f2a0 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72  if( iReg && pPar
2f2b0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
2f2c0 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
2f2d0 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
2f2e0 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
2f2f0 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
2f300 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70      for(i=0, p=p
2f310 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
2f320 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
2f330 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29  Cache; i++, p++)
2f340 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  {.      if( p->i
2f350 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
2f360 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
2f370 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
2f380 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
2f390 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61   }.    pParse->a
2f3a0 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
2f3b0 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52  nTempReg++] = iR
2f3c0 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
2f3d0 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61   Allocate or dea
2f3e0 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20  llocate a block 
2f3f0 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74  of nReg consecut
2f400 69 76 65 20 72 65 67 69 73 74 65 72 73 2e 0a 2a  ive registers..*
2f410 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
2f420 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
2f430 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65  *pParse, int nRe
2f440 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  g){.  int i, n;.
2f450 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 20    if( nReg==1 ) 
2f460 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47 65  return sqlite3Ge
2f470 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
2f480 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  i = pParse->
2f490 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d  iRangeReg;.  n =
2f4a0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2f4b0 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d  eg;.  if( nReg<=
2f4c0 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
2f4d0 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
2f4e0 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
2f4f0 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61  +n-1) );.    pPa
2f500 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
2f510 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
2f520 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
2f530 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
2f540 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
2f550 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
2f560 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
2f570 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
2f580 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
2f590 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2f5a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2f5b0 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
2f5c0 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d  eg){.  if( nReg=
2f5d0 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
2f5e0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2f5f0 70 50 61 72 73 65 2c 20 69 52 65 67 29 3b 0a 20  pParse, iReg);. 
2f600 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2f610 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2f620 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
2f630 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69  iReg, nReg);.  i
2f640 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e  f( nReg>pParse->
2f650 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20  nRangeReg ){.   
2f660 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2f670 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  eg = nReg;.    p
2f680 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2f690 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
2f6a0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74  /*.** Mark all t
2f6b0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
2f6c0 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76  rs as being unav
2f6d0 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73  ailable for reus
2f6e0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2f6f0 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
2f700 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
2f710 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54  e){.  pParse->nT
2f720 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50  empReg = 0;.  pP
2f730 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2f740 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61  = 0;.}../*.** Va
2f750 6c 69 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74  lidate that no t
2f760 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
2f770 72 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74  r falls within t
2f780 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69  he range of.** i
2f790 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e  First..iLast, in
2f7a0 63 6c 75 73 69 76 65 2e 20 20 54 68 69 73 20 72  clusive.  This r
2f7b0 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
2f7c0 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  all from within 
2f7d0 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74  assert().** stat
2f7e0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65  ements..*/.#ifde
2f7f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
2f800 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70  nt sqlite3NoTemp
2f810 73 49 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a  sInRange(Parse *
2f820 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72  pParse, int iFir
2f830 73 74 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a  st, int iLast){.
2f840 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
2f850 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2f860 3e 30 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d  >0.   && pParse-
2f870 3e 69 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73  >iRangeReg+pPars
2f880 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3e 20 69  e->nRangeReg > i
2f890 46 69 72 73 74 0a 20 20 20 26 26 20 70 50 61 72  First.   && pPar
2f8a0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3c 3d  se->iRangeReg <=
2f8b0 20 69 4c 61 73 74 0a 20 20 29 7b 0a 20 20 20 20   iLast.  ){.    
2f8c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2f8d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
2f8e0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b  se->nTempReg; i+
2f8f0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72  +){.    if( pPar
2f900 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e  se->aTempReg[i]>
2f910 3d 69 46 69 72 73 74 20 26 26 20 70 50 61 72 73  =iFirst && pPars
2f920 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d  e->aTempReg[i]<=
2f930 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  iLast ){.      r
2f940 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
2f950 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
2f960 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2f970 45 5f 44 45 42 55 47 20 2a 2f 0a                 E_DEBUG */.