/ Hex Artifact Content
Login

Artifact e44dda9df05faf96d340bbb68db3d1c47658576c13ac2fc3b660e0fe738d693e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
0fd0: 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20  quence might be 
0fe0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20  determined by a 
0ff0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
1000: 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72  .** or by the pr
1010: 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75  esence of a colu
1020: 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  mn with a define
1030: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
1040: 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45  ence..** COLLATE
1050: 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20   operators take 
1060: 66 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65  first precedence
1070: 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73  .  Left operands
1080: 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65   take.** precede
1090: 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f  nce over right o
10a0: 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c  perands..*/.Coll
10b0: 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72  Seq *sqlite3Expr
10c0: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
10d0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
10e0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
10f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1100: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1110: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
1120: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
1130: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
1140: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
1150: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
1160: 50 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61  P_Generic ) brea
1170: 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  k;.    if( op==T
1180: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1190: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
11a0: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
11b0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
11c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
11d0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f  TK_COLLATE || (o
11e0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
11f0: 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c  & p->op2==TK_COL
1200: 4c 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70  LATE) ){.      p
1210: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
1220: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
1230: 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e   ENC(db), 0, p->
1240: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1260: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
1270: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
1280: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1290: 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45      || op==TK_RE
12a0: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
12b0: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26  _TRIGGER).     &
12c0: 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  & p->pTab!=0.   
12d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d   ){.      /* op=
12e0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
12f0: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
1300: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
1310: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
1320: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1330: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1340: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1350: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1360: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1370: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1380: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1390: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
13a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
13b0: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
13c0: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
13d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
13e0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
13f0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
1400: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1420: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
1430: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1440: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1450: 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66  Left && (p->pLef
1460: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1470: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1480: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
1490: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
14a0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
14b0: 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74  ext  = p->pRight
14c0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
14d0: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
14e0: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
14f0: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
1500: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
1510: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1520: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
1530: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
1540: 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c          /* p->fl
1550: 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c  ags holds EP_Col
1560: 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66  late and p->pLef
1570: 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f  t->flags does no
1580: 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20  t.  And.        
1590: 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ** p->x.pSelect 
15a0: 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70  cannot.  So if p
15b0: 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73  ->x.pLeft exists
15c0: 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61  , it must hold a
15d0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61  t.        ** lea
15e0: 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74  st one EP_Collat
15f0: 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c  e. Thus the foll
1600: 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53  owing two ALWAYS
1610: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
1620: 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26   p->x.pList!=0 &
1630: 26 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61  & ALWAYS(!ExprHa
1640: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1650: 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20  xIsSelect)) ){. 
1660: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
1670: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1680: 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78  0; ALWAYS(i<p->x
1690: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20  .pList->nExpr); 
16a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
16b0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
16c0: 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74  perty(p->x.pList
16d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  ->a[i].pExpr, EP
16e0: 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20  _Collate) ){.   
16f0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74             pNext
1700: 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61   = p->x.pList->a
1710: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
1720: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1750: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20    }.        p = 
1760: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1770: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1780: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1790: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
17a0: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
17b0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
17c0: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
17d0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
17e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
17f0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
1800: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1810: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
1820: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1830: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
1840: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
1850: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1860: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1870: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1880: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
1890: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
18a0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
18b0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
18c0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
18d0: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
18e0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
18f0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1900: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
1910: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
1920: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
1930: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
1940: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
1950: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
1960: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
1970: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
1980: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
1990: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
19a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19b0: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
19c0: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
19d0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
19e0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
19f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a00: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
1a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1a20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1a30: 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BLOB;.    }.  }
1a40: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1a50: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1a60: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
1a70: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
1a80: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
1a90: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
1aa0: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
1ab0: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
1ac0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1ad0: 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BLOB;.  }else{.
1ae0: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
1af0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
1b00: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
1b10: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
1b20: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
1b30: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1b40: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1b50: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1b60: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
1b70: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
1b80: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1b90: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
1ba0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1bb0: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
1bc0: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1bd0: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1be0: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1bf0: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1c00: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1c10: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1c20: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1c30: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1c40: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1c50: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1c60: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
1c70: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
1c80: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
1c90: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
1ca0: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
1cb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
1cc0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1cd0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70  ->op==TK_NE || p
1ce0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1cf0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1d00: 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65  _ISNOT );.  asse
1d10: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1d20: 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69   );.  aff = sqli
1d30: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1d40: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1d50: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
1d60: 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ht ){.    aff = 
1d70: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1d80: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52  finity(pExpr->pR
1d90: 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65  ight, aff);.  }e
1da0: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
1db0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1dc0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1dd0: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1de0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1df0: 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63  (pExpr->x.pSelec
1e00: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
1e10: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
1e20: 65 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20  else if( aff==0 
1e30: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c  ){.    aff = SQL
1e40: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
1e50: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
1e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1e70: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65  s a comparison e
1e80: 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27  xpression, eg. '
1e90: 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29  =', '<', IN(...)
1ea0: 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66   etc..** idx_aff
1eb0: 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66  inity is the aff
1ec0: 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65  inity of an inde
1ed0: 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75  xed column. Retu
1ee0: 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68  rn true.** if th
1ef0: 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66  e index with aff
1f00: 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69  inity idx_affini
1f10: 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  ty may be used t
1f20: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74  o implement.** t
1f30: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  he comparison in
1f40: 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pExpr..*/.int s
1f50: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
1f60: 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70  ityOk(Expr *pExp
1f70: 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69  r, char idx_affi
1f80: 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66  nity){.  char af
1f90: 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  f = comparisonAf
1fa0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
1fb0: 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a   switch( aff ){.
1fc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1fd0: 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20  AFF_BLOB:.      
1fe0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61  return 1;.    ca
1ff0: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
2000: 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  XT:.      return
2010: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
2020: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
2030: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
2040: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2050: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
2060: 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ty(idx_affinity)
2070: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2080: 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c  eturn the P5 val
2090: 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ue that should b
20a0: 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e  e used for a bin
20b0: 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  ary comparison.*
20c0: 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c  * opcode (OP_Eq,
20d0: 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65   OP_Ge etc.) use
20e0: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78  d to compare pEx
20f0: 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a  pr1 and pExpr2..
2100: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e  */.static u8 bin
2110: 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70  aryCompareP5(Exp
2120: 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20  r *pExpr1, Expr 
2130: 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d  *pExpr2, int jum
2140: 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61  pIfNull){.  u8 a
2150: 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74  ff = (char)sqlit
2160: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2170: 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20  Expr2);.  aff = 
2180: 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61  (u8)sqlite3Compa
2190: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
21a0: 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75  1, aff) | (u8)ju
21b0: 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75  mpIfNull;.  retu
21c0: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
21d0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
21e0: 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69  r to the collati
21f0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  on sequence that
2200: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
2210: 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63  by.** a binary c
2220: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2230: 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65  or comparing pLe
2240: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
2250: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74  *.** If the left
2260: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
2270: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
2280: 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20   sequence type, 
2290: 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73  then it is.** us
22a0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  ed. Otherwise th
22b0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
22c0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67  ence for the rig
22d0: 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ht hand expressi
22e0: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f  on.** is used, o
22f0: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42  r the default (B
2300: 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65  INARY) if neithe
2310: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  r expression has
2320: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20   a collating.** 
2330: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  type..**.** Argu
2340: 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74  ment pRight (but
2350: 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20   not pLeft) may 
2360: 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  be a null pointe
2370: 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
2380: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f  .** it is not co
2390: 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c  nsidered..*/.Col
23a0: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e  lSeq *sqlite3Bin
23b0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
23c0: 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  q(.  Parse *pPar
23d0: 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65  se, .  Expr *pLe
23e0: 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69  ft, .  Expr *pRi
23f0: 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ght.){.  CollSeq
2400: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72   *pColl;.  asser
2410: 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66  t( pLeft );.  if
2420: 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ( pLeft->flags &
2430: 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
2440: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2450: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2460: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
2470: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
2480: 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61   && (pRight->fla
2490: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
24a0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  !=0 ){.    pColl
24b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24c0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52  llSeq(pParse, pR
24d0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
24e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
24f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2500: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
2510: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
2520: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
2530: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2540: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
2550: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2560: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
2570: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
2580: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
2590: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
25a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
25b0: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
25c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
25d0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
25e0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
25f0: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
2600: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
2610: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
2620: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
2630: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
2640: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
2650: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
2660: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
2670: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
2680: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20  e */.  int in1, 
2690: 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69  int in2, /* Regi
26a0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65  ster holding ope
26b0: 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rands */.  int d
26c0: 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
26d0: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75  Jump here if tru
26e0: 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  e.  */.  int jum
26f0: 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66  pIfNull    /* If
2700: 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65   true, jump if e
2710: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
2720: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
2730: 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72  t p5;.  int addr
2740: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b  ;.  CollSeq *p4;
2750: 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33  ..  p4 = sqlite3
2760: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
2770: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2780: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70  ft, pRight);.  p
2790: 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  5 = binaryCompar
27a0: 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68  eP5(pLeft, pRigh
27b0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
27c0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
27d0: 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73  VdbeAddOp4(pPars
27e0: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
27f0: 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31  , in2, dest, in1
2800: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
2820: 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53  id*)p4, P4_COLLS
2830: 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EQ);.  sqlite3Vd
2840: 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73  beChangeP5(pPars
2850: 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35  e->pVdbe, (u8)p5
2860: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
2870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2880: 6e 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73  n true if expres
2890: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20  sion pExpr is a 
28a0: 76 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65  vector, or false
28b0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
28c0: 2a 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65  * A vector is de
28d0: 66 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70  fined as any exp
28e0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73  ression that res
28f0: 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d  ults in two or m
2900: 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f  ore.** columns o
2910: 66 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79  f result.  Every
2920: 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20   TK_VECTOR node 
2930: 69 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63  is an vector bec
2940: 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73  ause the.** pars
2950: 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65  er will not gene
2960: 72 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52  rate a TK_VECTOR
2970: 20 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e   with fewer than
2980: 20 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a   two entries..**
2990: 20 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54   But a TK_SELECT
29a0: 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
29b0: 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73   a vector or a s
29c0: 63 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c  calar. It is onl
29d0: 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20  y.** considered 
29e0: 61 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68  a vector if it h
29f0: 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72  as two or more r
2a00: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  esult columns..*
2a10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2a20: 72 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a  rIsVector(Expr *
2a30: 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e  pExpr){.  return
2a40: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
2a50: 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b  orSize(pExpr)>1;
2a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
2a70: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
2a80: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
2a90: 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79  rgument is of ty
2aa0: 70 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a  pe TK_VECTOR .**
2ab0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
2ac0: 65 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  er of expression
2ad0: 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e  s in the vector.
2ae0: 20 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72   Or, if the expr
2af0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73  ession.** is a s
2b00: 75 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72  ub-select, retur
2b10: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2b20: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
2b30: 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a  ub-select. For.*
2b40: 2a 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65  * any other type
2b50: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   of expression, 
2b60: 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74  return 1..*/.int
2b70: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
2b80: 6f 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78  orSize(Expr *pEx
2b90: 70 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70  pr){.  u8 op = p
2ba0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
2bb0: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
2bc0: 29 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  ) op = pExpr->op
2bd0: 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  2;.  if( op==TK_
2be0: 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65  VECTOR ){.    re
2bf0: 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c  turn pExpr->x.pL
2c00: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65  ist->nExpr;.  }e
2c10: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53  lse if( op==TK_S
2c20: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74  ELECT ){.    ret
2c30: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  urn pExpr->x.pSe
2c40: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
2c50: 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  xpr;.  }else{.  
2c60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2c80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
2c90: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  ubexpression of 
2ca0: 70 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20  pVector that is 
2cb0: 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75  the i-th.** colu
2cc0: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
2cd0: 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74   (numbered start
2ce0: 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68  ing with 0).  Th
2cf0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
2d00: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69   ensure that i i
2d10: 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a  s within range..
2d20: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
2d30: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61   is really a sca
2d40: 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72  lar (and "scalar
2d50: 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20  " here includes 
2d60: 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68  subqueries.** th
2d70: 61 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  at return a sing
2d80: 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e  le column!) then
2d90: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20   return pVector 
2da0: 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  unmodified..**.*
2db0: 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e  * pVector retain
2dc0: 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  s ownership of t
2dd0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65  he returned sube
2de0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2df0: 20 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69   If the vector i
2e00: 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  s a (SELECT ...)
2e10: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
2e20: 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73  sion returned is
2e30: 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70  .** just the exp
2e40: 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20  ression for the 
2e50: 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  i-th term of the
2e60: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
2e70: 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72   may.** not be r
2e80: 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74  eady for evaluat
2e90: 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ion because the 
2ea0: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73  table cursor has
2eb0: 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e   not yet.** been
2ec0: 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a   positioned..*/.
2ed0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63  Expr *sqlite3Vec
2ee0: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
2ef0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69  Expr *pVector, i
2f00: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
2f10: 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65   i<sqlite3ExprVe
2f20: 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72  ctorSize(pVector
2f30: 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ) );.  if( sqlit
2f40: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
2f50: 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61  Vector) ){.    a
2f60: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
2f70: 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f  op2==0 || pVecto
2f80: 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
2f90: 45 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ER );.    if( pV
2fa0: 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  ector->op==TK_SE
2fb0: 4c 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d  LECT || pVector-
2fc0: 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  >op2==TK_SELECT 
2fd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2fe0: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65  pVector->x.pSele
2ff0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
3000: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73  .pExpr;.    }els
3010: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
3020: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
3030: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
3040: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3050: 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   pVector;.}../*.
3060: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
3070: 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72  eturn a new Expr
3080: 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68   object which wh
3090: 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20  en passed to.** 
30a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
30b0: 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  ) will generate 
30c0: 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f  all necessary co
30d0: 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a  de to compute.**
30e0: 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63   the iField-th c
30f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
3100: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70  tor expression p
3110: 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74  Vector..**.** It
3120: 20 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74   is ok for pVect
3130: 6f 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  or to be a scala
3140: 72 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46  r (as long as iF
3150: 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49  ield==0).  .** I
3160: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69  n that case, thi
3170: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
3180: 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
3190: 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Dup()..**.** The
31a0: 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65   caller owns the
31b0: 20 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f   returned Expr o
31c0: 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73  bject and is res
31d0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  ponsible for.** 
31e0: 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
31f0: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
3200: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
3210: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   freed..**.** Th
3220: 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73  e caller retains
3230: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56   ownership of pV
3240: 65 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74  ector.  If pVect
3250: 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43  or is a TK_SELEC
3260: 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  T,.** then the r
3270: 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77  eturned object w
3280: 69 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56  ill reference pV
3290: 65 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65  ector and so pVe
32a0: 63 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e  ctor must remain
32b0: 0a 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68  .** valid for th
32c0: 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65  e life of the re
32d0: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20  turned object.  
32e0: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
32f0: 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20  TK_VECTOR.** or 
3300: 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
3310: 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e  ion, then it can
3320: 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73   be deleted as s
3330: 6f 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74  oon as this rout
3340: 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a  ine.** returns..
3350: 2a 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f  **.** A trick to
3360: 20 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45   cause a TK_SELE
3370: 43 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  CT pVector to be
3380: 20 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65   deleted togethe
3390: 72 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65  r with.** the re
33a0: 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65  turned Expr obje
33b0: 63 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20  ct is to attach 
33c0: 74 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74  the pVector to t
33d0: 68 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a  he pRight field.
33e0: 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ** of the return
33f0: 65 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  ed TK_SELECT_COL
3400: 55 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e  UMN Expr object.
3410: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
3420: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
3430: 65 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  eld(.  Parse *pP
3440: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
3450: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
3460: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
3470: 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r,       /* The 
3480: 76 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66  vector.  List of
3490: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
34a0: 61 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a  a sub-SELECT */.
34b0: 20 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20    int iField    
34c0: 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
34d0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65  column of the ve
34e0: 63 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a  ctor to return *
34f0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65  /.){.  Expr *pRe
3500: 74 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72  t;.  if( pVector
3510: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3520: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3530: 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20  Vector->flags & 
3540: 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a  EP_xIsSelect );.
3550: 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45      /* The TK_SE
3560: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
3570: 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   node:.    **.  
3580: 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20    ** pLeft:     
3590: 20 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f        pVector co
35a0: 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45  ntaining TK_SELE
35b0: 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64  CT.  Not deleted
35c0: 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a  ..    ** pRight:
35d0: 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73            not us
35e0: 65 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69  ed.  But recursi
35f0: 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20  vely deleted..  
3600: 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20    ** iColumn:   
3610: 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61        Index of a
3620: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74   column in pVect
3630: 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65  or.    ** iTable
3640: 3a 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20  :          0 or 
3650: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
3660: 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53  lumns on the LHS
3670: 20 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e   of an assignmen
3680: 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e  t.    ** pLeft->
3690: 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20  iTable:   First 
36a0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
36b0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
36c0: 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20  result, or 0.   
36d0: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
36e0: 20 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75       if the resu
36f0: 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f  lt is not yet co
3700: 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  mputed..    **. 
3710: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70     ** sqlite3Exp
3720: 72 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66  rDelete() specif
3730: 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65  ically skips the
3740: 20 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74   recursive delet
3750: 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66  e of.    ** pLef
3760: 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43  t on TK_SELECT_C
3770: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75  OLUMN nodes.  Bu
3780: 74 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c  t pRight is foll
3790: 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72  owed, so pVector
37a0: 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61  .    ** can be a
37b0: 74 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68  ttached to pRigh
37c0: 74 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20  t to cause this 
37d0: 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e  node to take own
37e0: 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a  ership of.    **
37f0: 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63   pVector.  Typic
3800: 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20  ally there will 
3810: 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53  be multiple TK_S
3820: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  ELECT_COLUMN nod
3830: 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  es.    ** with t
3840: 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f  he same pLeft po
3850: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65  inter to the pVe
3860: 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f  ctor, but only o
3870: 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ne of them.    *
3880: 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70  * will own the p
3890: 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  Vector..    */. 
38a0: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
38b0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
38c0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c  K_SELECT_COLUMN,
38d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
38e0: 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52  pRet ){.      pR
38f0: 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46  et->iColumn = iF
3900: 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74  ield;.      pRet
3910: 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f  ->pLeft = pVecto
3920: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
3930: 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20  ert( pRet==0 || 
3940: 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  pRet->iTable==0 
3950: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3960: 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d  if( pVector->op=
3970: 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65  =TK_VECTOR ) pVe
3980: 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e  ctor = pVector->
3990: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  x.pList->a[iFiel
39a0: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52  d].pExpr;.    pR
39b0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
39c0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
39d0: 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d  pVector, 0);.  }
39e0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
39f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72  }../*.** If expr
3a00: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
3a10: 6f 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43  of type TK_SELEC
3a20: 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  T, generate code
3a30: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
3a40: 69 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72  it. Return the r
3a50: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
3a60: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
3a70: 74 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68  tored (or, if th
3a80: 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
3a90: 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68   returns more th
3aa0: 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74  an one column, t
3ab0: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
3ac0: 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73  rray.** of regis
3ad0: 74 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68  ters in which th
3ae0: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
3af0: 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ed)..**.** If pE
3b00: 78 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f  xpr is not a TK_
3b10: 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f  SELECT expressio
3b20: 6e 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  n, return 0..*/.
3b30: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
3b40: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72  odeSubselect(Par
3b50: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
3b60: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
3b70: 72 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  reg = 0;.#ifndef
3b80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
3b90: 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70  QUERY.  if( pExp
3ba0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
3bb0: 20 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71   ){.    reg = sq
3bc0: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
3bd0: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
3be0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
3bf0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67  dif.  return reg
3c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
3c10: 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e  ent pVector poin
3c20: 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65  ts to a vector e
3c30: 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68  xpression - eith
3c40: 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  er a TK_VECTOR.*
3c50: 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74  * or TK_SELECT t
3c60: 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  hat returns more
3c70: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
3c80: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
3c90: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72  returns.** the r
3ca0: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f  egister number o
3cb0: 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  f a register tha
3cc0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
3cd0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  alue of.** eleme
3ce0: 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65  nt iField of the
3cf0: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   vector..**.** I
3d00: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
3d10: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
3d20: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  ion, then code f
3d30: 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20  or it must have 
3d40: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3d50: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
3d60: 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62   the exprCodeSub
3d70: 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  select() routine
3d80: 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
3d90: 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53  e parameter regS
3da0: 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  elect should be 
3db0: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
3dc0: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
3dd0: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
3de0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
3df0: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
3e00: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
3e10: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
3e20: 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64  VECTOR, then cod
3e30: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
3e40: 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20  ted field.** is 
3e50: 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68  generated. In th
3e60: 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72  is case (*pRegFr
3e70: 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  ee) may be set t
3e80: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
3e90: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  ** a temporary r
3ea0: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72  egister to be fr
3eb0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
3ec0: 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
3ed0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
3ee0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70   returning, outp
3ef0: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
3f00: 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f  pExpr) is set to
3f10: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
3f20: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72   Expr object cor
3f30: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c  responding to el
3f40: 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74  ement iElem of t
3f50: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74  he vector..*/.st
3f60: 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63  atic int exprVec
3f70: 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50  torRegister(.  P
3f80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3fa0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
3fb0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
3fc0: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
3fd0: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74       /* Vector t
3fe0: 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e  o extract elemen
3ff0: 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
4000: 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20  iField,         
4010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4020: 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20  ield to extract 
4030: 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a  from pVector */.
4040: 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c    int regSelect,
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
4070: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
4080: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
4090: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
40a0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
40b0: 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74  pression element
40c0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46   */.  int *pRegF
40d0: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
40e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65        /* OUT: Te
40f0: 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
4100: 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f  ree */.){.  u8 o
4110: 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b  p = pVector->op;
4120: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
4130: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d  K_VECTOR || op==
4140: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
4150: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
4160: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
4170: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70  ISTER ){.    *pp
4180: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65  Expr = sqlite3Ve
4190: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
41a0: 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64  (pVector, iField
41b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
41c0: 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46  ector->iTable+iF
41d0: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ield;.  }.  if( 
41e0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
41f0: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
4200: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
4210: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69  t->pEList->a[iFi
4220: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
4230: 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63   return regSelec
4240: 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  t+iField;.  }.  
4250: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
4260: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
4270: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72  ield].pExpr;.  r
4280: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
4290: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
42a0: 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46  , *ppExpr, pRegF
42b0: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ree);.}../*.** E
42c0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
42d0: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
42e0: 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74  between two vect
42f0: 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75  or values. Compu
4300: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
4310: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
4320: 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c  on (1, 0, or NUL
4330: 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  L) and write tha
4340: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f  t.** result into
4350: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
4360: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4370: 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68   must satisfy th
4380: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63  e following prec
4390: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
43a0: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
43b0: 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70  ==TK_IS:      op
43c0: 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d  ==TK_EQ and p5==
43d0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
43e0: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
43f0: 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70  ==TK_ISNOT:   op
4400: 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d  ==TK_NE and p5==
4410: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4420: 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20      otherwise:  
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
4440: 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  ==pExpr->op and 
4450: 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20  p5==0.*/.static 
4460: 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43  void codeVectorC
4470: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
4480: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
4490: 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f  /* Code generato
44a0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
44b0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
44c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
44d0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
44e0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4500: 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
4510: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
4520: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
4530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
4540: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
4550: 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  r */.  u8 p5    
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4570: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72  SQLITE_NULLEQ or
4580: 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64   zero */.){.  Vd
4590: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
45a0: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
45b0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
45c0: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
45d0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
45e0: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74  ght;.  int nLeft
45f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
4600: 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
4610: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4620: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69  regLeft = 0;.  i
4630: 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b  nt regRight = 0;
4640: 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a  .  u8 opx = op;.
4650: 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d    int addrDone =
4660: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4670: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28  Label(v);..  if(
4680: 20 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45   nLeft!=sqlite3E
4690: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52  xprVectorSize(pR
46a0: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
46b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
46c0: 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
46d0: 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72  misused");.    r
46e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
46f0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
4700: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
4710: 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20  op==TK_NE .     
4720: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
4730: 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IS || pExpr->
4740: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20  op==TK_ISNOT .  
4750: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
4760: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70  p==TK_LT || pExp
4770: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20  r->op==TK_GT .  
4780: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
4790: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70  p==TK_LE || pExp
47a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20  r->op==TK_GE .  
47b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
47c0: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70  pr->op==op || (p
47d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
47e0: 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20  && op==TK_EQ).  
47f0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45            || (pE
4800: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4810: 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20  T && op==TK_NE) 
4820: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d  );.  assert( p5=
4830: 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21  =0 || pExpr->op!
4840: 3d 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =op );.  assert(
4850: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
4860: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
4870: 3d 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20  =op );..  p5 |= 
4880: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a  SQLITE_STOREP2;.
4890: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45    if( opx==TK_LE
48a0: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a   ) opx = TK_LT;.
48b0: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45    if( opx==TK_GE
48c0: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a   ) opx = TK_GT;.
48d0: 0a 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70  .  regLeft = exp
48e0: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
48f0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
4900: 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72   regRight = expr
4910: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4920: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a  arse, pRight);..
4930: 20 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c    for(i=0; 1 /*L
4940: 6f 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72  oop exits by "br
4950: 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20  eak"*/; i++){.  
4960: 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
4970: 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30   0, regFree2 = 0
4980: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20  ;.    Expr *pL, 
4990: 2a 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31  *pR; .    int r1
49a0: 2c 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74  , r2;.    assert
49b0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66  ( i>=0 && i<nLef
49c0: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30  t );.    if( i>0
49d0: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61   ) sqlite3ExprCa
49e0: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
49f0: 0a 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65  .    r1 = exprVe
4a00: 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61  ctorRegister(pPa
4a10: 72 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72  rse, pLeft, i, r
4a20: 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65  egLeft, &pL, &re
4a30: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20  gFree1);.    r2 
4a40: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
4a50: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69  ster(pParse, pRi
4a60: 67 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74  ght, i, regRight
4a70: 2c 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32  , &pR, &regFree2
4a80: 29 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  );.    codeCompa
4a90: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70  re(pParse, pL, p
4aa0: 52 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20  R, opx, r1, r2, 
4ab0: 64 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74  dest, p5);.    t
4ac0: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
4ad0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4ae0: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
4af0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
4b00: 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
4b10: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4b20: 50 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63  P_Le);.    testc
4b30: 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
4b40: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4b50: 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
4b60: 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
4b70: 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
4b80: 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
4b90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4ba0: 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
4bb0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4bc0: 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73  =OP_Eq);.    tes
4bd0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
4be0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4bf0: 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
4c00: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4c10: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4c20: 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20   regFree1);.    
4c30: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4c40: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
4c50: 67 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28  gFree2);.    if(
4c60: 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78   i>0 ) sqlite3Ex
4c70: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
4c80: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  e);.    if( i==n
4c90: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
4ca0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4cb0: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20   if( opx==TK_EQ 
4cc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4cd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4ce0: 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64  _IfNot, dest, ad
4cf0: 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76  drDone); VdbeCov
4d00: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
4d10: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
4d20: 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  PNULL;.    }else
4d30: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20   if( opx==TK_NE 
4d40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4d50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4d60: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
4d70: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
4d80: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
4d90: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
4da0: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
4db0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
4dc0: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LT || op==TK
4dd0: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45  _GT || op==TK_LE
4de0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b   || op==TK_GE );
4df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
4e10: 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64  lseNotEq, 0, add
4e20: 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  rDone);.      Vd
4e30: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
4e40: 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
4e50: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4e60: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  (v, op==TK_GT);.
4e70: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4e80: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
4e90: 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
4ea0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
4eb0: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66  TK_GE);.      if
4ec0: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
4ed0: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20  px = op;.    }. 
4ee0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4ef0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
4f00: 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69  addrDone);.}..#i
4f10: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
4f20: 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20  R_DEPTH>0./*.** 
4f30: 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d  Check that argum
4f40: 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c  ent nHeight is l
4f50: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
4f60: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
4f70: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
4f80: 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66  epth allowed. If
4f90: 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76   it is not, leav
4fa0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
4fb0: 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e  ge in.** pParse.
4fc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
4fd0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50  xprCheckHeight(P
4fe0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
4ff0: 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e  t nHeight){.  in
5000: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5010: 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74  ;.  int mxHeight
5020: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
5030: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5040: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
5050: 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78    if( nHeight>mx
5060: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  Height ){.    sq
5070: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5080: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45  arse, .       "E
5090: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
50a0: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
50b0: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
50c0: 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b   mxHeight.    );
50d0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
50e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
50f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
5100: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
5110: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
5120: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
5130: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
5140: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
5150: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
5160: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
5170: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5180: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
5190: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
51a0: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
51b0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
51c0: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
51d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
51e0: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
51f0: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
5200: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
5210: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
5220: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
5230: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
5240: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
5250: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
5260: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
5270: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
5280: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
5290: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
52a0: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
52b0: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
52c0: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
52d0: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
52e0: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
52f0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5300: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5310: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
5320: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5330: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5340: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
5350: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
5360: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
5370: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
5380: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
5390: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
53a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
53b0: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
53c0: 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  ct *p, int *pnHe
53d0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
53e0: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  {.    heightOfEx
53f0: 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e  pr(p->pWhere, pn
5400: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5410: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61  ghtOfExpr(p->pHa
5420: 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b  ving, pnHeight);
5430: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5440: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48  r(p->pLimit, pnH
5450: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5460: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66  htOfExpr(p->pOff
5470: 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  set, pnHeight);.
5480: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5490: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
54a0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
54b0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
54c0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
54d0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
54e0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
54f0: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
5500: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5510: 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f  fSelect(p->pPrio
5520: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
5530: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
5540: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
5550: 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20  variable in the 
5560: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
5570: 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d   as an .** argum
5580: 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69  ent. An expressi
5590: 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64  on with no child
55a0: 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20  ren, Expr.pList 
55b0: 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c  or .** Expr.pSel
55c0: 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61  ect member has a
55d0: 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e   height of 1. An
55e0: 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  y other expressi
55f0: 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67  on.** has a heig
5600: 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ht equal to the 
5610: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
5620: 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20  f any other .** 
5630: 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20  referenced Expr 
5640: 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  plus one..**.** 
5650: 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 45  Also propagate E
5660: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5670: 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e 78  s up from Expr.x
5680: 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e 66  .pList to Expr.f
5690: 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72  lags,.** if appr
56a0: 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
56b0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
56c0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
56d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
56e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
56f0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
5700: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
5710: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
5720: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
5730: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
5740: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
5750: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
5760: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
5770: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
5780: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
5790: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
57a0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
57b0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48  (p->x.pList, &nH
57c0: 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66  eight);.    p->f
57d0: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
57e0: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
57f0: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5800: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70  .pList);.  }.  p
5810: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
5820: 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ght + 1;.}../*.*
5830: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
5840: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
5850: 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53 65  using the exprSe
5860: 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74 69  tHeight() functi
5870: 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65  on. If.** the he
5880: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
5890: 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  than the maximum
58a0: 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73   allowed express
58b0: 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65  ion depth,.** le
58c0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
58d0: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  pParse..**.** Al
58e0: 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c 6c  so propagate all
58f0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c   EP_Propagate fl
5900: 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ags from the Exp
5910: 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a  r.x.pList into.*
5920: 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a  * Expr.flags. .*
5930: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5940: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
5950: 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ags(Parse *pPars
5960: 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  e, Expr *p){.  i
5970: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
5980: 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72  ) return;.  expr
5990: 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20  SetHeight(p);.  
59a0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
59b0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
59c0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f  ->nHeight);.}../
59d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
59e0: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
59f0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
5a00: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
5a10: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
5a20: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
5a30: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
5a40: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5a50: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
5a60: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
5a70: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
5a80: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
5a90: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
5aa0: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
5ab0: 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f  ;.}.#else /* ABO
5ac0: 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f  VE:  Height enfo
5ad0: 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e  rcement enabled.
5ae0: 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20    BELOW: Height 
5af0: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20  enforcement off 
5b00: 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61  */./*.** Propaga
5b10: 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67  te all EP_Propag
5b20: 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74  ate flags from t
5b30: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
5b40: 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61  into.** Expr.fla
5b50: 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gs. .*/.void sql
5b60: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
5b70: 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20  tAndFlags(Parse 
5b80: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
5b90: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
5ba0: 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78 70  >x.pList && !Exp
5bb0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5bc0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
5bd0: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
5be0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
5bf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
5c00: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
5c10: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
5c20: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
5c30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5c40: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
5c50: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
5c60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
5c70: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
5c80: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
5c90: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
5ca0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
5cb0: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
5cc0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
5cd0: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
5ce0: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
5cf0: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
5d00: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
5d10: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
5d20: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5d30: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
5d40: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
5d50: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
5d60: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
5d70: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
5d80: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
5d90: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
5da0: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
5db0: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
5dc0: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
5dd0: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
5de0: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
5df0: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
5e00: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ing is performed
5e10: 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a  .  The deQuote.*
5e20: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  * parameter is i
5e30: 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e  gnored if pToken
5e40: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
5e50: 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f  he token does no
5e60: 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62  t.** appear to b
5e70: 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68  e quoted.  If th
5e80: 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66  e quotes were of
5e90: 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20   the form "..." 
5ea0: 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a  (double-quotes).
5eb0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44  ** then the EP_D
5ec0: 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73  blQuoted flag is
5ed0: 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72   set on the expr
5ee0: 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a  ession node..**.
5ef0: 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  ** Special case:
5f00: 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45    If op==TK_INTE
5f10: 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70  GER and pToken p
5f20: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
5f30: 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  g that.** can be
5f40: 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f   translated into
5f50: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
5f60: 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  r, then the toke
5f70: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72  n is not.** stor
5f80: 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20  ed in u.zToken. 
5f90: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e   Instead, the in
5fa0: 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73 20  teger values is 
5fb0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
5fc0: 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65  u.iValue and the
5fd0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
5fe0: 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78  g is set.  No ex
5ff0: 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69  tra storage.** i
6000: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  s allocated to h
6010: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  old the integer 
6020: 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65 71  text and the deq
6030: 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e  uote flag is ign
6040: 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ored..*/.Expr *s
6050: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
6060: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
6070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
6080: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
6090: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20  DbMallocRawNN() 
60a0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60c0: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
60d0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  e */.  const Tok
60e0: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f  en *pToken,    /
60f0: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
6100: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
6110: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
6120: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
6130: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
6140: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
6150: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  New;.  int nExtr
6160: 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  a = 0;.  int iVa
6170: 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  lue = 0;..  asse
6180: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
6190: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
61a0: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45   if( op!=TK_INTE
61b0: 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a  GER || pToken->z
61c0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
61d0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
61e0: 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61  (pToken->z, &iVa
61f0: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lue)==0 ){.     
6200: 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e   nExtra = pToken
6210: 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  ->n+1;.      ass
6220: 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29  ert( iValue>=0 )
6230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
6240: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
6250: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
6260: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
6270: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
6280: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  {.    memset(pNe
6290: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  w, 0, sizeof(Exp
62a0: 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  r));.    pNew->o
62b0: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
62c0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
62d0: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  .    if( pToken 
62e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  ){.      if( nEx
62f0: 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tra==0 ){.      
6300: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6310: 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
6320: 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 70 4e  Leaf;.        pN
6330: 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
6340: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Value;.      }el
6350: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
6360: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68  ->u.zToken = (ch
6370: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
6380: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
6390: 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54  oken->z!=0 || pT
63a0: 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20  oken->n==0 );.  
63b0: 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e        if( pToken
63c0: 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65  ->n ) memcpy(pNe
63d0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f  w->u.zToken, pTo
63e0: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
63f0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  n);.        pNew
6400: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65  ->u.zToken[pToke
6410: 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  n->n] = 0;.     
6420: 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26     if( dequote &
6430: 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65  & sqlite3Isquote
6440: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  (pNew->u.zToken[
6450: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0]) ){.         
6460: 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f   if( pNew->u.zTo
6470: 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70 4e  ken[0]=='"' ) pN
6480: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
6490: 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20  DblQuoted;.     
64a0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
64b0: 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  ote(pNew->u.zTok
64c0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  en);.        }. 
64d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
64e0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
64f0: 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65  _DEPTH>0.    pNe
6500: 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a  w->nHeight = 1;.
6510: 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72  #endif  .  }.  r
6520: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
6530: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
6540: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
6550: 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  ode from a zero-
6560: 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e  terminated token
6570: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72   that has.** alr
6580: 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74  eady been dequot
6590: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
65a0: 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69  ite3Expr(.  sqli
65b0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
65c0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
65d0: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
65e0: 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20  cZero() (may be 
65f0: 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  null) */.  int o
6600: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6610: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6620: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e   opcode */.  con
6630: 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20  st char *zToken 
6640: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72       /* Token ar
6650: 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  gument.  Might b
6660: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54  e NULL */.){.  T
6670: 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20  oken x;.  x.z = 
6680: 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20  zToken;.  x.n = 
6690: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
66a0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72  zToken);.  retur
66b0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
66c0: 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30  oc(db, op, &x, 0
66d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61  );.}../*.** Atta
66e0: 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65 66  ch subtrees pLef
66f0: 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20  t and pRight to 
6700: 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52  the Expr node pR
6710: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52  oot..**.** If pR
6720: 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  oot==NULL that m
6730: 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f  eans that a memo
6740: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
6750: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
6760: 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73  ..** In that cas
6770: 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73 75  e, delete the su
6780: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6790: 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64   pRight..*/.void
67a0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
67b0: 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73 71  chSubtrees(.  sq
67c0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70  lite3 *db,.  Exp
67d0: 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72  r *pRoot,.  Expr
67e0: 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20   *pLeft,.  Expr 
67f0: 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28  *pRight.){.  if(
6800: 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20   pRoot==0 ){.   
6810: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
6820: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
6830: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6840: 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  te(db, pLeft);. 
6850: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6860: 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29  lete(db, pRight)
6870: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
6880: 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  f( pRight ){.   
6890: 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74     pRoot->pRight
68a0: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
68b0: 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d   pRoot->flags |=
68c0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
68d0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20  pRight->flags;. 
68e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
68f0: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
6900: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
6910: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66  ;.      pRoot->f
6920: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
6930: 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c  gate & pLeft->fl
6940: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  ags;.    }.    e
6950: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52 6f  xprSetHeight(pRo
6960: 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ot);.  }.}../*.*
6970: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78  * Allocate an Ex
6980: 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f  pr node which jo
6990: 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  ins as many as t
69a0: 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a  wo subtrees..**.
69b0: 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  ** One or both o
69c0: 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20 63  f the subtrees c
69d0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74  an be NULL.  Ret
69e0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
69f0: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72   the new.** Expr
6a00: 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61   node.  Or, if a
6a10: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
6a20: 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e  rs, set pParse->
6a30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6a40: 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75  ,.** free the su
6a50: 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75 72  btrees and retur
6a60: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20  n NULL..*/.Expr 
6a70: 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20  *sqlite3PExpr(. 
6a80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
6aa0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6ab0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
6ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
6ad0: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
6ae0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
6af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
6b00: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
6b10: 45 78 70 72 20 2a 70 52 69 67 68 74 20 20 20 20  Expr *pRight    
6b20: 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
6b30: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20   operand */.){. 
6b40: 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20   Expr *p;.  if( 
6b50: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50  op==TK_AND && pP
6b60: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
6b70: 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76  .    /* Take adv
6b80: 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d  antage of short-
6b90: 63 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70  circuit false op
6ba0: 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41  timization for A
6bb0: 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71  ND */.    p = sq
6bc0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
6bd0: 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20  rse->db, pLeft, 
6be0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
6bf0: 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
6c00: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
6c10: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
6c20: 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 69 66  f(Expr));.    if
6c30: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ( p ){.      mem
6c40: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
6c50: 28 45 78 70 72 29 29 3b 0a 20 20 20 20 20 20 70  (Expr));.      p
6c60: 2d 3e 6f 70 20 3d 20 6f 70 20 26 20 54 4b 46 4c  ->op = op & TKFL
6c70: 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 70 2d  G_MASK;.      p-
6c80: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
6c90: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
6ca0: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
6cb0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70  pParse->db, p, p
6cc0: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
6cd0: 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20   }.  if( p ) {. 
6ce0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68     sqlite3ExprCh
6cf0: 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65  eckHeight(pParse
6d00: 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20  , p->nHeight);. 
6d10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
6d20: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c  ../*.** Add pSel
6d30: 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e  ect to the Expr.
6d40: 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64 2e  x.pSelect field.
6d50: 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69    Or, if pExpr i
6d60: 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64  s NULL (due.** d
6d70: 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  o a memory alloc
6d80: 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20 74  ation failure) t
6d90: 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 70  hen delete the p
6da0: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a  Select object..*
6db0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 45  /.void sqlite3PE
6dc0: 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61 72  xprAddSelect(Par
6dd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
6de0: 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74 20   *pExpr, Select 
6df0: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66 28  *pSelect){.  if(
6e00: 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45   pExpr ){.    pE
6e10: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d  xpr->x.pSelect =
6e20: 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78   pSelect;.    Ex
6e30: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
6e40: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
6e50: 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a  t|EP_Subquery);.
6e60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
6e70: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
6e80: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
6e90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6ea0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
6eb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6ec0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
6ed0: 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  ectDelete(pParse
6ee0: 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  ->db, pSelect);.
6ef0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66    }.}.../*.** If
6f00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6f10: 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72  is always either
6f20: 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28   TRUE or FALSE (
6f30: 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a  respectively),.*
6f40: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e  * then return 1.
6f50: 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20    If one cannot 
6f60: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72  determine the tr
6f70: 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65  uth value of the
6f80: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
6f90: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72  t compile-time r
6fa0: 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54  eturn 0..**.** T
6fb0: 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
6fc0: 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f  zation.  If is O
6fd0: 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65  K to return 0 he
6fe0: 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68  re even if.** th
6ff0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61  e expression rea
7000: 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61  lly is always fa
7010: 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20  lse or false (a 
7020: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e  false negative).
7030: 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20  .** But it is a 
7040: 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20  bug to return 1 
7050: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7060: 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66  n might have dif
7070: 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61  ferent.** boolea
7080: 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66  n values in diff
7090: 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e  erent circumstan
70a0: 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73  ces (a false pos
70b0: 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f  itive.).**.** No
70c0: 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65  te that if the e
70d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72  xpression is par
70e0: 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c  t of conditional
70f0: 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a   for a.** LEFT J
7100: 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  OIN, then we can
7110: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74  not determine at
7120: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
7130: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
7140: 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61  is it true or fa
7150: 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72  lse, so always r
7160: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
7170: 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79  ic int exprAlway
7180: 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a  sTrue(Expr *p){.
7190: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69    int v = 0;.  i
71a0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
71b0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
71c0: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
71d0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
71e0: 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76  rIsInteger(p, &v
71f0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
7200: 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73  return v!=0;.}.s
7210: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c  tatic int exprAl
7220: 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a  waysFalse(Expr *
7230: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
7240: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
7250: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
7260: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
7270: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
7280: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
7290: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
72a0: 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b  ;.  return v==0;
72b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74  .}../*.** Join t
72c0: 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75  wo expressions u
72d0: 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72  sing an AND oper
72e0: 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72  ator.  If either
72f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
7300: 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73  * NULL, then jus
7310: 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68  t return the oth
7320: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  er expression..*
7330: 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65  *.** If one side
7340: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
7350: 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77   the AND is know
7360: 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74  n to be false, t
7370: 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f  hen instead.** o
7380: 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41  f returning an A
7390: 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a  ND expression, j
73a0: 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e  ust return a con
73b0: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
73c0: 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65   with.** a value
73d0: 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78   of false..*/.Ex
73e0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41  pr *sqlite3ExprA
73f0: 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
7400: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
7410: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66  r *pRight){.  if
7420: 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20  ( pLeft==0 ){.  
7430: 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b    return pRight;
7440: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
7450: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ght==0 ){.    re
7460: 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65  turn pLeft;.  }e
7470: 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
7480: 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c  ysFalse(pLeft) |
7490: 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  | exprAlwaysFals
74a0: 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  e(pRight) ){.   
74b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
74c0: 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  te(db, pLeft);. 
74d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
74e0: 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29  lete(db, pRight)
74f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
7500: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
7510: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73  , TK_INTEGER, &s
7520: 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
7530: 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  0], 0);.  }else{
7540: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20  .    Expr *pNew 
7550: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
7560: 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30  oc(db, TK_AND, 0
7570: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7580: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
7590: 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c  ees(db, pNew, pL
75a0: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
75b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20    return pNew;. 
75c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
75d0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
75e0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
75f0: 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  a function with 
7600: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75  multiple.** argu
7610: 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ments..*/.Expr *
7620: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
7630: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
7640: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
7650: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
7660: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  n){.  Expr *pNew
7670: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7680: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7690: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
76a0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
76b0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
76c0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f  TK_FUNCTION, pTo
76d0: 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ken, 1);.  if( p
76e0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
76f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
7700: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
7710: 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20  /* Avoid memory 
7720: 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  leak when malloc
7730: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
7740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
7750: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c  ew->x.pList = pL
7760: 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ist;.  assert( !
7770: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7780: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
7790: 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ct) );.  sqlite3
77a0: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
77b0: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e  Flags(pParse, pN
77c0: 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ew);.  return pN
77d0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
77e0: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
77f0: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
7800: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
7810: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
7820: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
7830: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
7840: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
7850: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
7860: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
7870: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
7880: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
7890: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
78a0: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
78b0: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
78c0: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
78d0: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
78e0: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
78f0: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
7900: 6f 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76  ot too big to av
7910: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
7920: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
7930: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
7940: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
7950: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
7960: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
7970: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7980: 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61  orm ":aaa", "@aa
7990: 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72  a", or "$aaa" ar
79a0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
79b0: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
79c0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
79d0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
79e0: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
79f0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
7a00: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
7a10: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
7a20: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
7a30: 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20  ential variable 
7a40: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
7a50: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
7a60: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
7a70: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
7a80: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7a90: 45 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20  Expr, u32 n){.  
7aa0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7ab0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73  arse->db;.  cons
7ac0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56  t char *z;.  ynV
7ad0: 61 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78  ar x;..  if( pEx
7ae0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
7af0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
7b00: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
7b10: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  , EP_IntValue|EP
7b20: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
7b30: 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20  nOnly) );.  z = 
7b40: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
7b50: 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20  .  assert( z!=0 
7b60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30  );.  assert( z[0
7b70: 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ]!=0 );.  assert
7b80: 28 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74 65  ( n==(u32)sqlite
7b90: 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a  3Strlen30(z) );.
7ba0: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b    if( z[1]==0 ){
7bb0: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
7bc0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22   of the form "?"
7bd0: 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65  .  Assign the ne
7be0: 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  xt variable numb
7bf0: 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  er */.    assert
7c00: 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20  ( z[0]=='?' );. 
7c10: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b     x = (ynVar)(+
7c20: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
7c30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
7c40: 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20   doAdd = 0;.    
7c50: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
7c60: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
7c70: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
7c80: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
7c90: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
7ca0: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
7cb0: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
7cc0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
7cd0: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
7ce0: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20       int bOk;.  
7cf0: 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20      if( n==2 ){ 
7d00: 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49  /*OPTIMIZATION-I
7d10: 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20  F-TRUE*/.       
7d20: 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20   i = z[1]-'0';  
7d30: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
7d40: 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73  se of ?N for a s
7d50: 69 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f  ingle digit N */
7d60: 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31  .        bOk = 1
7d70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7d80: 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d         bOk = 0==
7d90: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a  sqlite3Atoi64(&z
7da0: 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51  [1], &i, n-1, SQ
7db0: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
7dc0: 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
7dd0: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
7de0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
7df0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7e00: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7e10: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7e20: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
7e30: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
7e40: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
7e50: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7e60: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
7e70: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
7e80: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
7e90: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
7ea0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
7eb0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
7ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7ed0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
7ee0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
7ef0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
7f00: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
7f10: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
7f20: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7f30: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
7f40: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
7f50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7f60: 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20  x = (ynVar)i;.  
7f70: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
7f80: 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->nVar ){.      
7f90: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
7fa0: 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20   (int)x;.       
7fb0: 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20   doAdd = 1;.    
7fc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
7fd0: 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d  te3VListNumToNam
7fe0: 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  e(pParse->pVList
7ff0: 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , x)==0 ){.     
8000: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8010: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
8020: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
8030: 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c  rds like ":aaa",
8040: 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61   "$aaa" or "@aaa
8050: 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61  ".  Reuse the sa
8060: 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  me variable.    
8070: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
8080: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
8090: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
80a0: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
80b0: 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  name.      ** ha
80c0: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
80d0: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
80e0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
80f0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f   number.      */
8100: 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61  .      x = (ynVa
8110: 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61  r)sqlite3VListNa
8120: 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e  meToNum(pParse->
8130: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20  pVList, z, n);. 
8140: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b       if( x==0 ){
8150: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e  .        x = (yn
8160: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
8170: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f  Var);.        do
8180: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
8190: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
81a0: 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50  oAdd ){.      pP
81b0: 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73  arse->pVList = s
81c0: 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64  qlite3VListAdd(d
81d0: 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  b, pParse->pVLis
81e0: 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20  t, z, n, x);.   
81f0: 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e   }.  }.  pExpr->
8200: 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69  iColumn = x;.  i
8210: 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  f( x>db->aLimit[
8220: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
8230: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
8240: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8250: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
8260: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
8270: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
8280: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
8290: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
82a0: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73  ssion tree..*/.s
82b0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
82c0: 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74  NLINE void sqlit
82d0: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73  e3ExprDeleteNN(s
82e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
82f0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
8300: 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e  p!=0 );.  /* San
8310: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
8320: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
8330: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
8340: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
8350: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
8360: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8370: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
8380: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
8390: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
83a0: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45 78  E_DEBUG.  if( Ex
83b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
83c0: 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78   EP_Leaf) && !Ex
83d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
83e0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
83f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8400: 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
8410: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
8420: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht==0 );.    ass
8430: 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63  ert( p->x.pSelec
8440: 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  t==0 );.  }.#end
8450: 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  if.  if( !ExprHa
8460: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50  sProperty(p, (EP
8470: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65  _TokenOnly|EP_Le
8480: 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  af)) ){.    /* T
8490: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
84a0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
84b0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
84c0: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
84d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
84e0: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
84f0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8500: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
8510: 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  & p->op!=TK_SELE
8520: 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69  CT_COLUMN ) sqli
8530: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8540: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
8550: 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
8560: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8570: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62  3ExprDeleteNN(db
8580: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
8590: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
85a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
85b0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
85c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
85d0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
85e0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
85f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8600: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8610: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  ete(db, p->x.pLi
8620: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  st);.    }.  }. 
8630: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8640: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
8650: 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62  ken) ) sqlite3Db
8660: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
8670: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 45 78  oken);.  if( !Ex
8680: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8690: 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20   EP_Static) ){. 
86a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
86b0: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  NN(db, p);.  }.}
86c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
86d0: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
86e0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
86f0: 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33   if( p ) sqlite3
8700: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8710: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
8720: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8730: 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
8740: 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ed for the expre
8750: 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20  ssion structure 
8760: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
8770: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8780: 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
8790: 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c   one of EXPR_FUL
87a0: 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52  LSIZE,.** EXPR_R
87b0: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58  EDUCEDSIZE or EX
87c0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
87d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
87e0: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  exprStructSize(E
87f0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45  xpr *p){.  if( E
8800: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8810: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
8820: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f  ) return EXPR_TO
8830: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69  KENONLYSIZE;.  i
8840: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8850: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
8860: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
8870: 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72  REDUCEDSIZE;.  r
8880: 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53  eturn EXPR_FULLS
8890: 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  IZE;.}../*.** Th
88a0: 65 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65  e dupedExpr*Size
88b0: 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68  () routines each
88c0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
88d0: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
88e0: 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ired.** to store
88f0: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
8900: 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72  pression or expr
8910: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68  ession tree.  Th
8920: 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20  ey differ in.** 
8930: 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20  how much of the 
8940: 74 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64  tree is measured
8950: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65  ..**.**     dupe
8960: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
8970: 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e  )     Size of on
8980: 6c 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75  ly the Expr stru
8990: 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75  cture .**     du
89a0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
89b0: 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20  )       Size of 
89c0: 45 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72  Expr + space for
89d0: 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75   token.**     du
89e0: 70 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20  pedExprSize()   
89f0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74          Expr + t
8a00: 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63  oken + subtree c
8a10: 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a  omponents.**.***
8a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a60: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
8a70: 68 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75  he dupedExprStru
8a80: 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f  ctSize() functio
8a90: 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61  n returns two va
8aa0: 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74  lues OR-ed toget
8ab0: 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68  her:  .** (1) th
8ac0: 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  e space required
8ad0: 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74   for a copy of t
8ae0: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
8af0: 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28  e only and .** (
8b00: 32 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c  2) the EP_xxx fl
8b10: 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74  ags that indicat
8b20: 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63  e what the struc
8b30: 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64  ture size should
8b40: 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75   be..** The retu
8b50: 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77  rn values is alw
8b60: 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a  ays one of:.**.*
8b70: 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c  *      EXPR_FULL
8b80: 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50  SIZE.**      EXP
8b90: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20  R_REDUCEDSIZE   
8ba0: 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20  | EP_Reduced.** 
8bb0: 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f       EXPR_TOKENO
8bc0: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
8bd0: 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65  enOnly.**.** The
8be0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72   size of the str
8bf0: 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f  ucture can be fo
8c00: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
8c10: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
8c20: 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ** of this routi
8c30: 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20  ne with 0xfff.  
8c40: 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65  The flags can be
8c50: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
8c60: 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20  g the.** return 
8c70: 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65  value with EP_Re
8c80: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
8c90: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ly..**.** Note t
8ca0: 68 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d  hat with flags==
8cb0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
8cc0: 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f  this routines wo
8cd0: 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65  rks on full-size
8ce0: 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20  .** (unreduced) 
8cf0: 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20  Expr objects as 
8d00: 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c  they or original
8d10: 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ly constructed b
8d20: 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a  y the parser..**
8d30: 20 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69   During expressi
8d40: 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74  on analysis, ext
8d50: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
8d60: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d  s computed and m
8d70: 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74  oved into.** lat
8d80: 65 72 20 70 61 72 74 73 20 6f 66 20 74 65 68 20  er parts of teh 
8d90: 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  Expr object and 
8da0: 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72  that extra infor
8db0: 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74  mation might get
8dc0: 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20   chopped.** off 
8dd0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
8de0: 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e  n is reduced.  N
8df0: 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74  ote also that it
8e00: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74   does not work t
8e10: 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50  o.** make an EXP
8e20: 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79  RDUP_REDUCE copy
8e30: 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78   of a reduced ex
8e40: 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73  pression.  It is
8e50: 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74   only legal.** t
8e60: 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74  o reduce a prist
8e70: 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ine expression t
8e80: 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ree from the par
8e90: 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d  ser.  The implem
8ea0: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64  entation.** of d
8eb0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
8ec0: 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c  ze() contain mul
8ed0: 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73  tiple assert() s
8ee0: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61  tatements that a
8ef0: 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66  ttempt.** to enf
8f00: 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72  orce this constr
8f10: 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aint..*/.static 
8f20: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72  int dupedExprStr
8f30: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  uctSize(Expr *p,
8f40: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
8f50: 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65  nt nSize;.  asse
8f60: 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  rt( flags==EXPRD
8f70: 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61  UP_REDUCE || fla
8f80: 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79  gs==0 ); /* Only
8f90: 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20   one flag value 
8fa0: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73  allowed */.  ass
8fb0: 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49  ert( EXPR_FULLSI
8fc0: 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61  ZE<=0xfff );.  a
8fd0: 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20  ssert( (0xfff & 
8fe0: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
8ff0: 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b  okenOnly))==0 );
9000: 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20  .  if( 0==flags 
9010: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  || p->op==TK_SEL
9020: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  ECT_COLUMN ){.  
9030: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46    nSize = EXPR_F
9040: 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65  ULLSIZE;.  }else
9050: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  {.    assert( !E
9060: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9070: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
9080: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
9090: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
90a0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
90b0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
90c0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
90d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
90e0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20  P_MemToken) );. 
90f0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9100: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9110: 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20  P_NoReduce) );. 
9120: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
9130: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
9140: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
9150: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
9160: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
9170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
9180: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
9190: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69  ==0 );.      nSi
91a0: 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  ze = EXPR_TOKENO
91b0: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
91c0: 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20  enOnly;.    }.  
91d0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65  }.  return nSize
91e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
91f0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
9200: 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79   the space in by
9210: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
9220: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a  store the copy .
9230: 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  ** of the Expr s
9240: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63  tructure and a c
9250: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e  opy of the Expr.
9260: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
9270: 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69  (if that.** stri
9280: 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a  ng is defined.).
9290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
92a0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
92b0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
92c0: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
92d0: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
92e0: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
92f0: 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20   & 0xfff;.  if( 
9300: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9310: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
9320: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
9330: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
9340: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9350: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a  p->u.zToken)+1;.
9360: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55    }.  return ROU
9370: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  ND8(nByte);.}../
9380: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
9390: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
93a0: 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
93b0: 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  te a duplicate o
93c0: 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73  f the .** expres
93d0: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
93e0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
93f0: 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  t. The second ar
9400: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d  gument is a.** m
9410: 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45  ask containing E
9420: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
9430: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
9440: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  e returned inclu
9450: 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65  des space to cre
9460: 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
9470: 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a  e Expr struct.**
9480: 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20   itself and the 
9490: 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20  buffer referred 
94a0: 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f  to by Expr.u.zTo
94b0: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ken, if any..**.
94c0: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
94d0: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
94e0: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
94f0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c  eturn value incl
9500: 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74  udes .** space t
9510: 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20  o duplicate all 
9520: 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68  Expr nodes in th
9530: 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79  e tree formed by
9540: 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20   Expr.pLeft .** 
9550: 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20  and Expr.pRight 
9560: 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e  variables (but n
9570: 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63  ot for any struc
9580: 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tures pointed to
9590: 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65   or .** descende
95a0: 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  d from the Expr.
95b0: 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e  x.pList or Expr.
95c0: 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62  x.pSelect variab
95d0: 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  les)..*/.static 
95e0: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a  int dupedExprSiz
95f0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
9600: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
9610: 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  te = 0;.  if( p 
9620: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64  ){.    nByte = d
9630: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
9640: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
9650: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
9660: 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  P_REDUCE ){.    
9670: 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64    nByte += duped
9680: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66  ExprSize(p->pLef
9690: 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65  t, flags) + dupe
96a0: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69  dExprSize(p->pRi
96b0: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
96c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
96d0: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
96e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
96f0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
9700: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
9710: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
9720: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
9730: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
9740: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
9750: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
9760: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
9770: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
9780: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
9790: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
97a0: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
97b0: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
97c0: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
97d0: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
97e0: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
97f0: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
9800: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
9810: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
9820: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
9830: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
9840: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
9850: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
9860: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
9870: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
9880: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
9890: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
98a0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
98b0: 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20  nt dupFlags, u8 
98c0: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
98d0: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
98e0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
98f0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20   return */.  u8 
9900: 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  *zAlloc;        
9910: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61     /* Memory spa
9920: 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  ce from which to
9930: 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65   build Expr obje
9940: 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74  ct */.  u32 stat
9950: 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  icFlag;       /*
9960: 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70   EP_Static if sp
9970: 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64  ace not obtained
9980: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a   from malloc */.
9990: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
99a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20   );.  assert( p 
99b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70  );.  assert( dup
99c0: 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46  Flags==0 || dupF
99d0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
99e0: 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74  DUCE );.  assert
99f0: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
9a00: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
9a10: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20  UP_REDUCE );..  
9a20: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
9a30: 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
9a40: 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74   new Expr struct
9a50: 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a  ure. */.  if( pz
9a60: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41  Buffer ){.    zA
9a70: 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72  lloc = *pzBuffer
9a80: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
9a90: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
9aa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f  }else{.    zAllo
9ab0: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
9ac0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70  locRawNN(db, dup
9ad0: 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75  edExprSize(p, du
9ae0: 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74  pFlags));.    st
9af0: 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20  aticFlag = 0;.  
9b00: 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72  }.  pNew = (Expr
9b10: 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66   *)zAlloc;..  if
9b20: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a  ( pNew ){.    /*
9b30: 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f   Set nNewSize to
9b40: 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61   the size alloca
9b50: 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75  ted for the stru
9b60: 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
9b70: 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e  .    ** by pNew.
9b80: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
9b90: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
9ba0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
9bb0: 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  or.    ** EXPR_T
9bc0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
9bd0: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
9be0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
9bf0: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
9c00: 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f  ** by the copy o
9c10: 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  f the p->u.zToke
9c20: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79  n string (if any
9c30: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f  )..    */.    co
9c40: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
9c50: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
9c60: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
9c70: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
9c80: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
9c90: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
9ca0: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69  e & 0xfff;.    i
9cb0: 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69  nt nToken;.    i
9cc0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
9cd0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
9ce0: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
9cf0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b  en ){.      nTok
9d00: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
9d10: 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  en30(p->u.zToken
9d20: 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  ) + 1;.    }else
9d30: 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d  {.      nToken =
9d40: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
9d50: 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20  ( dupFlags ){.  
9d60: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
9d70: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9d80: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
9d90: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
9da0: 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a  lloc, p, nNewSiz
9db0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9dc0: 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d       u32 nSize =
9dd0: 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74   (u32)exprStruct
9de0: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d  Size(p);.      m
9df0: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
9e00: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69   nSize);.      i
9e10: 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55  f( nSize<EXPR_FU
9e20: 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20  LLSIZE ){ .     
9e30: 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f     memset(&zAllo
9e40: 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50  c[nSize], 0, EXP
9e50: 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65  R_FULLSIZE-nSize
9e60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9e70: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
9e80: 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f   EP_Reduced, EP_
9e90: 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45  TokenOnly, and E
9ea0: 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61  P_Static flags a
9eb0: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f  ppropriately. */
9ec0: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
9ed0: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
9ee0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
9ef0: 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f  _Static|EP_MemTo
9f00: 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ken);.    pNew->
9f10: 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74  flags |= nStruct
9f20: 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63  Size & (EP_Reduc
9f30: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
9f40: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  ;.    pNew->flag
9f50: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
9f60: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
9f70: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
9f80: 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ring, if any. */
9f90: 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20  .    if( nToken 
9fa0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
9fb0: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
9fc0: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
9fd0: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
9fe0: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
9ff0: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
a000: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
a010: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d    }..    if( 0==
a020: 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d  ((p->flags|pNew-
a030: 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f  >flags) & (EP_To
a040: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a050: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
a060: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
a070: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
a080: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
a090: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
a0a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a0b0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
a0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a0d0: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
a0e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a0f0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
a100: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a120: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
a130: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a140: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
a150: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
a160: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a170: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
a180: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
a190: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
a1a0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a1b0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
a1c0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a1d0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  nly) ){.      zA
a1e0: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a1f0: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a200: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a210: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a220: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a230: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a240: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a250: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a260: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a270: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a280: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a290: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a2a0: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a2b0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a2c0: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2e0: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a2f0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a300: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a310: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a320: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a    }.      if( pz
a330: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
a340: 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41    *pzBuffer = zA
a350: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lloc;.      }.  
a360: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
a370: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a380: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
a390: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a3a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
a3b0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
a3c0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
a3d0: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
a3e0: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
a3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a400: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70  >iColumn==0 || p
a410: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
a420: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
a430: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c   p->pRight==0  |
a440: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e  | p->pRight==p->
a450: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20  pLeft );.       
a460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a470: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
a480: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a490: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
a4a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a4b0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a4c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a4d0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
a4e0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
a4f0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
a500: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
a510: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
a520: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
a530: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
a540: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
a550: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
a560: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
a570: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
a580: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
a590: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
a5a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
a5b0: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
a5c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
a5d0: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
a5e0: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
a5f0: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
a600: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
a610: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
a620: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
a630: 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28  of(*p) + sizeof(
a640: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
a650: 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74  Cte-1);.    pRet
a660: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a670: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
a680: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  );.    if( pRet 
a690: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
a6a0: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65        pRet->nCte
a6b0: 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20   = p->nCte;.    
a6c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a6d0: 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
a6e0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70      pRet->a[i].p
a6f0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a700: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
a710: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30  >a[i].pSelect, 0
a720: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
a730: 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71  >a[i].pCols = sq
a740: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a750: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f  (db, p->a[i].pCo
a760: 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ls, 0);.        
a770: 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pRet->a[i].zName
a780: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a790: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  up(db, p->a[i].z
a7a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
a7b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a7c0: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
a7d0: 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70  # define withDup
a7e0: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a  (x,y) 0.#endif..
a7f0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a800: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
a810: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
a820: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
a830: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
a840: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
a850: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
a860: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
a870: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
a880: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
a890: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
a8a0: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
a8b0: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
a8c0: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
a8d0: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
a8e0: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
a8f0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
a900: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
a910: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
a920: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
a930: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
a940: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
a950: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
a960: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
a970: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
a980: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
a990: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
a9a0: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
a9b0: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
a9c0: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
a9d0: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
a9e0: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
a9f0: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
aa00: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
aa10: 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
aa20: 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74  tains a combinat
aa30: 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44  ion of the EXPRD
aa40: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
aa50: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
aa60: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
aa70: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
aa80: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
aa90: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
aaa0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
aab0: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
aac0: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
aad0: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
aae0: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
aaf0: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
ab00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
ab10: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
ab20: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
ab30: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
ab40: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
ab50: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
ab60: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
ab70: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
ab80: 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  CE );.  return p
ab90: 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   ? exprDup(db, p
aba0: 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b  , flags, 0) : 0;
abb0: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
abc0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
abd0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
abe0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
abf0: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
ac00: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
ac10: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
ac20: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
ac30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
ac40: 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43  r *pPriorSelectC
ac50: 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ol = 0;.  assert
ac60: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
ac70: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
ac80: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
ac90: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
aca0: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  db, .           
acb0: 20 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 2b    sizeof(*pNew)+
acc0: 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 61 5b 30  sizeof(pNew->a[0
acd0: 5d 29 2a 28 70 2d 3e 6e 45 78 70 72 2d 31 29 20  ])*(p->nExpr-1) 
ace0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
acf0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
ad00: 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e  New->nExpr = p->
ad10: 6e 45 78 70 72 3b 0a 20 20 2f 2a 20 41 66 74 65  nExpr;.  /* Afte
ad20: 72 20 62 65 69 6e 67 20 64 75 70 6c 69 63 61 74  r being duplicat
ad30: 65 64 2c 20 74 68 65 20 45 78 70 72 4c 69 73 74  ed, the ExprList
ad40: 20 6d 61 79 20 6e 6f 74 20 62 65 20 65 78 70 61   may not be expa
ad50: 6e 64 65 64 20 61 67 61 69 6e 20 75 73 69 6e 67  nded again using
ad60: 0a 20 20 2a 2a 20 41 70 70 65 6e 64 28 29 20 62  .  ** Append() b
ad70: 65 63 61 75 73 65 20 41 70 70 65 6e 64 28 29 20  ecause Append() 
ad80: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
ad90: 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   number of slots
ada0: 20 69 6e 0a 20 20 2a 2a 20 45 78 70 72 4c 69 73   in.  ** ExprLis
adb0: 74 2e 61 5b 5d 20 69 73 20 61 20 70 6f 77 65 72  t.a[] is a power
adc0: 20 6f 66 20 32 20 2a 2f 0a 20 20 56 56 41 5f 4f   of 2 */.  VVA_O
add0: 4e 4c 59 28 20 70 4e 65 77 2d 3e 62 46 69 78 65  NLY( pNew->bFixe
ade0: 64 53 69 7a 65 20 3d 20 31 20 29 3b 0a 20 20 70  dSize = 1 );.  p
adf0: 49 74 65 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a  Item = pNew->a;.
ae00: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
ae10: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
ae20: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
ae30: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
ae40: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
ae50: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
ae60: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45  em->pExpr;.    E
ae70: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
ae80: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
ae90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
aea0: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66  (db, pOldExpr, f
aeb0: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
aec0: 4f 6c 64 45 78 70 72 20 0a 20 20 20 20 20 26 26  OldExpr .     &&
aed0: 20 70 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54   pOldExpr->op==T
aee0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a  K_SELECT_COLUMN.
aef0: 20 20 20 20 20 26 26 20 28 70 4e 65 77 45 78 70       && (pNewExp
af00: 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
af10: 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
af20: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45     assert( pNewE
af30: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  xpr->iColumn==0 
af40: 7c 7c 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  || i>0 );.      
af50: 69 66 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43  if( pNewExpr->iC
af60: 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
af70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
af80: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c  Expr->pLeft==pOl
af90: 64 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 3b  dExpr->pRight );
afa0: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 53  .        pPriorS
afb0: 65 6c 65 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45  electCol = pNewE
afc0: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65  xpr->pLeft = pNe
afd0: 77 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  wExpr->pRight;. 
afe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aff0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
b000: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b010: 74 28 20 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78  t( pItem[-1].pEx
b020: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
b030: 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70   assert( pNewExp
b040: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65  r->iColumn==pIte
b050: 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  m[-1].pExpr->iCo
b060: 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20  lumn+1 );.      
b070: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
b080: 53 65 6c 65 63 74 43 6f 6c 3d 3d 70 49 74 65 6d  SelectCol==pItem
b090: 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 70 4c 65 66  [-1].pExpr->pLef
b0a0: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  t );.        pNe
b0b0: 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70  wExpr->pLeft = p
b0c0: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3b 0a  PriorSelectCol;.
b0d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b0e0: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
b0f0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b100: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
b110: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
b120: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
b130: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b140: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
b150: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
b160: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
b170: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
b180: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
b190: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
b1a0: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
b1b0: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
b1c0: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
b1d0: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
b1e0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
b1f0: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
b200: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
b210: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
b220: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
b230: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
b240: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
b250: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
b260: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
b270: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
b280: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
b290: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
b2a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
b2b0: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
b2c0: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
b2d0: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
b2e0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
b2f0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
b300: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b310: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
b320: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
b330: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b340: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
b350: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
b360: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
b370: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
b380: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
b390: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
b3a0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73  int nByte;.  ass
b3b0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
b3c0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
b3d0: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
b3e0: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
b3f0: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
b400: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
b410: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
b420: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
b430: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e  allocRawNN(db, n
b440: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
b450: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
b460: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
b470: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
b480: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
b490: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
b4a0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
b4b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
b4c0: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
b4d0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
b4e0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
b4f0: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
b500: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
b510: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
b520: 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c  m->pSchema = pOl
b530: 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a  dItem->pSchema;.
b540: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44      pNewItem->zD
b550: 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
b560: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b570: 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ldItem->zDatabas
b580: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
b590: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
b5a0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b5b0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
b5c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41      pNewItem->zA
b5d0: 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62  lias = sqlite3Db
b5e0: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
b5f0: 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
b600: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d    pNewItem->fg =
b610: 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20   pOldItem->fg;. 
b620: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
b630: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
b640: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e  >iCursor;.    pN
b650: 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ewItem->addrFill
b660: 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Sub = pOldItem->
b670: 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20  addrFillSub;.   
b680: 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65   pNewItem->regRe
b690: 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  turn = pOldItem-
b6a0: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
b6b0: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
b6c0: 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a  .isIndexedBy ){.
b6d0: 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e        pNewItem->
b6e0: 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  u1.zIndexedBy = 
b6f0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b700: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31  db, pOldItem->u1
b710: 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20  .zIndexedBy);.  
b720: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
b730: 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c  ->pIBIndex = pOl
b740: 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b  dItem->pIBIndex;
b750: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65  .    if( pNewIte
b760: 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
b770: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65  ){.      pNewIte
b780: 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d  m->u1.pFuncArg =
b790: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
b7a0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
b7b0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e  b, pOldItem->u1.
b7c0: 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29  pFuncArg, flags)
b7d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
b7e0: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
b7f0: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
b800: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
b810: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
b820: 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  nTabRef++;.    }
b830: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
b840: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
b850: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f  SelectDup(db, pO
b860: 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  ldItem->pSelect,
b870: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
b880: 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c  wItem->pOn = sql
b890: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b8a0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66  pOldItem->pOn, f
b8b0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
b8c0: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
b8d0: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64  lite3IdListDup(d
b8e0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73  b, pOldItem->pUs
b8f0: 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ing);.    pNewIt
b900: 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f  em->colUsed = pO
b910: 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  ldItem->colUsed;
b920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
b930: 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71  ew;.}.IdList *sq
b940: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73  lite3IdListDup(s
b950: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
b960: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
b970: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
b980: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
b990: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
b9a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b9b0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
b9c0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
b9d0: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
b9e0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b9f0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
ba00: 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20  nId = p->nId;.  
ba10: 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65  pNew->a = sqlite
ba20: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
ba30: 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66  b, p->nId*sizeof
ba40: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
ba50: 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b  f( pNew->a==0 ){
ba60: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
ba70: 65 65 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b 0a  eeNN(db, pNew);.
ba80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ba90: 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  }.  /* Note that
baa0: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a   because the siz
bab0: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
bac0: 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69  ion for p->a[] i
bad0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73  s not.  ** neces
bae0: 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f  sarily a power o
baf0: 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64  f two, sqlite3Id
bb00: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79  ListAppend() may
bb10: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20   not be called. 
bb20: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69   ** on the dupli
bb30: 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20  cate created by 
bb40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
bb50: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
bb60: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
bb70: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
bb80: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
bb90: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
bba0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
bbb0: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
bbc0: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
bbd0: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
bbe0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
bbf0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
bc00: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
bc10: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
bc20: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
bc30: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
bc40: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
bc50: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
bc60: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70  db, Select *pDup
bc70: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
bc80: 53 65 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30  Select *pRet = 0
bc90: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78  ;.  Select *pNex
bca0: 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20  t = 0;.  Select 
bcb0: 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20  **pp = &pRet;.  
bcc0: 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73  Select *p;..  as
bcd0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
bce0: 20 66 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20   for(p=pDup; p; 
bcf0: 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  p=p->pPrior){.  
bd00: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d    Select *pNew =
bd10: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
bd20: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
bd30: 28 2a 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20  (*p) );.    if( 
bd40: 70 4e 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b  pNew==0 ) break;
bd50: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  .    pNew->pELis
bd60: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
bd70: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
bd80: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
bd90: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
bda0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
bdb0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c  (db, p->pSrc, fl
bdc0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
bdd0: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
bde0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
bdf0: 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Where, flags);. 
be00: 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42     pNew->pGroupB
be10: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
be20: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47  istDup(db, p->pG
be30: 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a  roupBy, flags);.
be40: 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e      pNew->pHavin
be50: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
be60: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
be70: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  g, flags);.    p
be80: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
be90: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
bea0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  up(db, p->pOrder
beb0: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  By, flags);.    
bec0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
bed0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78  ;.    pNew->pNex
bee0: 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70  t = pNext;.    p
bef0: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b  New->pPrior = 0;
bf00: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  .    pNew->pLimi
bf10: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
bf20: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  up(db, p->pLimit
bf30: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
bf40: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71  ew->pOffset = sq
bf50: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
bf60: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61   p->pOffset, fla
bf70: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  gs);.    pNew->i
bf80: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
bf90: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
bfa0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46  ;.    pNew->selF
bfb0: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
bfc0: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
bfd0: 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77  emeral;.    pNew
bfe0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
bff0: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  ] = -1;.    pNew
c000: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
c010: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  ] = -1;.    pNew
c020: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
c030: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
c040: 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20    pNew->pWith = 
c050: 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70  withDup(db, p->p
c060: 57 69 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  With);.    sqlit
c070: 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
c080: 70 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d  pNew, p->zSelNam
c090: 65 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 4e  e);.    *pp = pN
c0a0: 65 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70 4e  ew;.    pp = &pN
c0b0: 65 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  ew->pPrior;.    
c0c0: 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
c0d0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
c0e0: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
c0f0: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
c100: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
c110: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66  Select *p, int f
c120: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
c130: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
c140: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
c150: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
c160: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
c170: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
c180: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
c190: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
c1a0: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
c1b0: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
c1c0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
c1d0: 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 61 72 67  ** The pList arg
c1e0: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 69  ument must be ei
c1f0: 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 70  ther NULL or a p
c200: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 45 78 70  ointer to an Exp
c210: 72 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69 6e 65  rList.** obtaine
c220: 64 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  d from a prior c
c230: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 78  all to sqlite3Ex
c240: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 2e 20  prListAppend(). 
c250: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
c260: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
c270: 20 77 69 74 68 20 61 6e 20 45 78 70 72 4c 69 73   with an ExprLis
c280: 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
c290: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
c2a0: 75 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f 6e 3a  up()..** Reason:
c2b0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
c2c0: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
c2d0: 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  number of slots 
c2e0: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a 2a 2a  in pList->a[].**
c2f0: 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
c300: 77 6f 2e 20 20 54 68 61 74 20 69 73 20 74 72 75  wo.  That is tru
c310: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70  e for sqlite3Exp
c320: 72 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 65  rListAppend() re
c330: 74 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69 73 20  turns.** but is 
c340: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
c350: 74 72 75 65 20 66 72 6f 6d 20 74 68 65 20 72 65  true from the re
c360: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
c370: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c380: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  ()..**.** If a m
c390: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
c3a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
c3b0: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
c3c0: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
c3d0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
c3e0: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
c3f0: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
c400: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
c410: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
c420: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
c430: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
c440: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
c450: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
c460: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
c470: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c480: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
c490: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
c4a0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
c4b0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
c4c0: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
c4d0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
c4e0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
c4f0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
c500: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
c510: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
c520: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  LL */.){.  struc
c530: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
c540: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
c550: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c560: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
c570: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
c580: 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69   pList==0 || pLi
c590: 73 74 2d 3e 62 46 69 78 65 64 53 69 7a 65 3d 3d  st->bFixedSize==
c5a0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
c5b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
c5c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c5d0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
c5e0: 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a  of(ExprList) );.
c5f0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
c600: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
c610: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
c620: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20   pList->nExpr = 
c630: 30 3b 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  0;.    VVA_ONLY(
c640: 20 70 4c 69 73 74 2d 3e 62 46 69 78 65 64 53 69   pList->bFixedSi
c650: 7a 65 20 3d 20 30 20 29 3b 0a 20 20 7d 65 6c 73  ze = 0 );.  }els
c660: 65 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45  e if( (pList->nE
c670: 78 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45  xpr & (pList->nE
c680: 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20  xpr-1))==0 ){.  
c690: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
c6a0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
c6b0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
c6c0: 2c 20 70 4c 69 73 74 2c 20 0a 20 20 20 20 20 20  , pList, .      
c6d0: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
c6e0: 4c 69 73 74 29 2b 28 32 2a 70 4c 69 73 74 2d 3e  List)+(2*pList->
c6f0: 6e 45 78 70 72 20 2d 20 31 29 2a 73 69 7a 65 6f  nExpr - 1)*sizeo
c700: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
c710: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
c720: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
c730: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
c740: 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pList = pNew;. 
c750: 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c   }.  pItem = &pL
c760: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
c770: 78 70 72 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74  xpr++];.  assert
c780: 28 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63  ( offsetof(struc
c790: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c  t ExprList_item,
c7a0: 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70  zName)==sizeof(p
c7b0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a  Item->pExpr) );.
c7c0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
c7d0: 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69  of(struct ExprLi
c7e0: 73 74 5f 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d  st_item,pExpr)==
c7f0: 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
c800: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69  Item->zName,0,si
c810: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66  zeof(*pItem)-off
c820: 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70  setof(struct Exp
c830: 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65  rList_item,zName
c840: 29 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78  ));.  pItem->pEx
c850: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 72 65  pr = pExpr;.  re
c860: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f  turn pList;..no_
c870: 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41  mem:     .  /* A
c880: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
c890: 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61  ory if malloc ha
c8a0: 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73  s failed. */.  s
c8b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
c8c0: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  (db, pExpr);.  s
c8d0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
c8e0: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
c8f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c900: 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61  /*.** pColumns a
c910: 6e 64 20 70 45 78 70 72 20 66 6f 72 6d 20 61 20  nd pExpr form a 
c920: 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e  vector assignmen
c930: 74 20 77 68 69 63 68 20 69 73 20 70 61 72 74 20  t which is part 
c940: 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c  of the SET.** cl
c950: 61 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54  ause of an UPDAT
c960: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69  E statement.  Li
c970: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
c980: 20 20 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20        (a,b,c) = 
c990: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
c9a0: 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61  r3).** Or:    (a
c9b0: 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45 43 54 20  ,b,c) = (SELECT 
c9c0: 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29  x,y,z FROM ....)
c9d0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
c9e0: 74 65 72 6d 20 6f 66 20 74 68 65 20 76 65 63 74  term of the vect
c9f0: 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61  or assignment, a
ca00: 70 70 65 6e 64 20 6e 65 77 20 65 6e 74 72 69 65  ppend new entrie
ca10: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72  s to the.** expr
ca20: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73  ession list pLis
ca30: 74 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65 20  t.  In the case 
ca40: 6f 66 20 61 20 73 75 62 71 75 65 72 79 20 6f 6e  of a subquery on
ca50: 20 74 68 65 20 52 48 53 2c 20 61 70 70 65 6e 64   the RHS, append
ca60: 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  .** TK_SELECT_CO
ca70: 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73  LUMN expressions
ca80: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
ca90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
caa0: 70 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50 61  pendVector(.  Pa
cab0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
cac0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
cad0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
cae0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
caf0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
cb00: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
cb10: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
cb20: 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75  .  IdList *pColu
cb30: 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73  mns,      /* Lis
cb40: 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48  t of names of LH
cb50: 53 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e 6d  S of the assignm
cb60: 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ent */.  Expr *p
cb70: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
cb80: 2f 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65 73  /* Vector expres
cb90: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
cba0: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
cbb0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
cbc0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
cbd0: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  >db;.  int n;.  
cbe0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 46 69  int i;.  int iFi
cbf0: 72 73 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  rst = pList ? pL
cc00: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
cc10: 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61    /* pColumns ca
cc20: 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64  n only be NULL d
cc30: 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74  ue to an OOM but
cc40: 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75   an OOM will cau
cc50: 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20  se an.  ** exit 
cc60: 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f  prior to this ro
cc70: 75 74 69 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f  utine being invo
cc80: 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ked */.  if( NEV
cc90: 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20  ER(pColumns==0) 
cca0: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
ccb0: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66  pend_error;.  if
ccc0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 67 6f 74  ( pExpr==0 ) got
ccd0: 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f  o vector_append_
cce0: 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20  error;..  /* If 
ccf0: 74 68 65 20 52 48 53 20 69 73 20 61 20 76 65 63  the RHS is a vec
cd00: 74 6f 72 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  tor, then we can
cd10: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 63 68 65   immediately che
cd20: 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 0a  ck to see that .
cd30: 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66    ** the size of
cd40: 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53   the RHS and LHS
cd50: 20 6d 61 74 63 68 2e 20 20 42 75 74 20 69 66 20   match.  But if 
cd60: 74 68 65 20 52 48 53 20 69 73 20 61 20 53 45 4c  the RHS is a SEL
cd70: 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63  ECT, .  ** wildc
cd80: 61 72 64 73 20 28 22 2a 22 29 20 69 6e 20 74 68  ards ("*") in th
cd90: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
cda0: 74 68 65 20 53 45 4c 45 43 54 20 6d 75 73 74 20  the SELECT must 
cdb0: 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
cdc0: 72 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20 64  re.  ** we can d
cdd0: 6f 20 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b  o the size check
cde0: 2c 20 73 6f 20 64 65 66 65 72 20 74 68 65 20 73  , so defer the s
cdf0: 69 7a 65 20 63 68 65 63 6b 20 75 6e 74 69 6c 20  ize check until 
ce00: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
ce10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
ce20: 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54  r->op!=TK_SELECT
ce30: 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49   && pColumns->nI
ce40: 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78 70  d!=(n=sqlite3Exp
ce50: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
ce60: 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r)) ){.    sqlit
ce70: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ce80: 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61  e, "%d columns a
ce90: 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65  ssigned %d value
cea0: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
ceb0: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73          pColumns
cec0: 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67  ->nId, n);.    g
ced0: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
cee0: 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  d_error;.  }..  
cef0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75  for(i=0; i<pColu
cf00: 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  mns->nId; i++){.
cf10: 20 20 20 20 45 78 70 72 20 2a 70 53 75 62 45 78      Expr *pSubEx
cf20: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
cf30: 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70  ForVectorField(p
cf40: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29  Parse, pExpr, i)
cf50: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
cf60: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
cf70: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73  end(pParse, pLis
cf80: 74 2c 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20  t, pSubExpr);.  
cf90: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
cfa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
cfb0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73  st->nExpr==iFirs
cfc0: 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70  t+i+1 );.      p
cfd0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
cfe0: 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
cff0: 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a  pColumns->a[i].z
d000: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Name;.      pCol
d010: 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  umns->a[i].zName
d020: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
d030: 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
d040: 6f 63 46 61 69 6c 65 64 20 26 26 20 70 45 78 70  ocFailed && pExp
d050: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
d060: 20 26 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74   && ALWAYS(pList
d070: 21 3d 30 29 20 29 7b 0a 20 20 20 20 45 78 70 72  !=0) ){.    Expr
d080: 20 2a 70 46 69 72 73 74 20 3d 20 70 4c 69 73 74   *pFirst = pList
d090: 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70  ->a[iFirst].pExp
d0a0: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
d0b0: 46 69 72 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  First!=0 );.    
d0c0: 61 73 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e  assert( pFirst->
d0d0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
d0e0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20  LUMN );.     .  
d0f0: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 53    /* Store the S
d100: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
d110: 69 6e 20 70 52 69 67 68 74 20 73 6f 20 69 74 20  in pRight so it 
d120: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
d130: 77 68 65 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69  when.    ** sqli
d140: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
d150: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f  e() is called */
d160: 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 70 52 69  .    pFirst->pRi
d170: 67 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  ght = pExpr;.   
d180: 20 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20   pExpr = 0;..   
d190: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
d1a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4c 48 53   size of the LHS
d1b0: 20 69 6e 20 69 54 61 62 6c 65 20 73 6f 20 74 68   in iTable so th
d1c0: 61 74 20 77 65 20 63 61 6e 20 63 68 65 63 6b 20  at we can check 
d1d0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
d1e0: 52 48 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65  RHS and LHS size
d1f0: 73 20 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63  s match during c
d200: 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
d210: 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 69  */.    pFirst->i
d220: 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73  Table = pColumns
d230: 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74  ->nId;.  }..vect
d240: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a  or_append_error:
d250: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
d260: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
d270: 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
d280: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75  Delete(db, pColu
d290: 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  mns);.  return p
d2a0: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  List;.}../*.** S
d2b0: 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  et the sort orde
d2c0: 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65  r for the last e
d2d0: 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69  lement on the gi
d2e0: 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  ven ExprList..*/
d2f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
d300: 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65  rListSetSortOrde
d310: 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  r(ExprList *p, i
d320: 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a  nt iSortOrder){.
d330: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
d340: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53  urn;.  assert( S
d350: 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e  QLITE_SO_UNDEFIN
d360: 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53  ED<0 && SQLITE_S
d370: 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49  O_ASC>=0 && SQLI
d380: 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a  TE_SO_DESC>0 );.
d390: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78    assert( p->nEx
d3a0: 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53  pr>0 );.  if( iS
d3b0: 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20  ortOrder<0 ){.  
d3c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70    assert( p->a[p
d3d0: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
d3e0: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
d3f0: 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ASC );.    retur
d400: 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d  n;.  }.  p->a[p-
d410: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
d420: 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f  der = (u8)iSortO
d430: 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rder;.}../*.** S
d440: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
d450: 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e  a[].zName elemen
d460: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
d470: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
d480: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
d490: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
d4a0: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
d4b0: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
d4c0: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
d4d0: 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64  But pName should
d4e0: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
d4f0: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
d500: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
d510: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
d520: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
d530: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
d540: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
d550: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20  prListSetName(. 
d560: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d570: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
d580: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
d590: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d5a0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
d5b0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
d5c0: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
d5d0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
d5e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
d5f0: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20  to be added */. 
d600: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
d610: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
d620: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61   to cause the na
d630: 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65  me to be dequote
d640: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
d650: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50  ( pList!=0 || pP
d660: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
d670: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
d680: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
d690: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d6a0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
d6b0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
d6c0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70  nExpr>0 );.    p
d6d0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
d6e0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
d6f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
d700: 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b  tem->zName==0 );
d710: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
d720: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
d730: 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  NDup(pParse->db,
d740: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
d750: 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65  ->n);.    if( de
d760: 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44  quote ) sqlite3D
d770: 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e  equote(pItem->zN
d780: 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ame);.  }.}../*.
d790: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
d7a0: 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c  ist.a[].zSpan el
d7b0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
d7c0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
d7d0: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
d7e0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
d7f0: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
d800: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
d810: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
d820: 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68  r.  But pSpan sh
d830: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
d840: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
d850: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
d860: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
d870: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
d880: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
d890: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d8a0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61  e3ExprListSetSpa
d8b0: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
d8c0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
d8d0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d8e0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d8f0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
d900: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
d910: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
d920: 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53  /.  ExprSpan *pS
d930: 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54  pan         /* T
d940: 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64  he span to be ad
d950: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ded */.){.  sqli
d960: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d970: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
d980: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e  pList!=0 || db->
d990: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
d9a0: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
d9b0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
d9c0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
d9d0: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
d9e0: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
d9f0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
da00: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
da10: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
da20: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74  locFailed || pIt
da30: 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e  em->pExpr==pSpan
da40: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73  ->pExpr );.    s
da50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
da60: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
da70: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
da80: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
da90: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
daa0: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20  Span->zStart,.  
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a    (int)(pSpan->z
dae0: 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74  End - pSpan->zSt
daf0: 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  art));.  }.}../*
db00: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
db10: 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73  ssion list pELis
db20: 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  t contains more 
db30: 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d  than iLimit elem
db40: 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  ents,.** leave a
db50: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
db60: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
db70: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
db80: 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20  stCheckLength(. 
db90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
dba0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
dbb0: 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  st,.  const char
dbc0: 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69   *zObject.){.  i
dbd0: 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e  nt mx = pParse->
dbe0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
dbf0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b  E_LIMIT_COLUMN];
dc00: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
dc10: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
dc20: 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65  Expr==mx );.  te
dc30: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
dc40: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
dc50: 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  =mx+1 );.  if( p
dc60: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
dc70: 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20  >nExpr>mx ){.   
dc80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
dc90: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
dca0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73  ny columns in %s
dcb0: 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d  ", zObject);.  }
dcc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
dcd0: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
dce0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73  ssion list..*/.s
dcf0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
dd00: 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c  NLINE void exprL
dd10: 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  istDeleteNN(sqli
dd20: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
dd30: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
dd40: 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   i = pList->nExp
dd50: 72 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  r;.  struct Expr
dd60: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
dd70: 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20   =  pList->a;.  
dd80: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
dd90: 45 78 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a  Expr>0 );.  do{.
dda0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
ddb0: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
ddc0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
ddd0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
dde0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
ddf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
de00: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
de10: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a  );.    pItem++;.
de20: 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30 20    }while( --i>0 
de30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
de40: 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b  eeNN(db, pList);
de50: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
de60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71  xprListDelete(sq
de70: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
de80: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
de90: 66 28 20 70 4c 69 73 74 20 29 20 65 78 70 72 4c  f( pList ) exprL
dea0: 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  istDeleteNN(db, 
deb0: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
dec0: 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 77   Return the bitw
ded0: 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78  ise-OR of all Ex
dee0: 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20  pr.flags fields 
def0: 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  in the given.** 
df00: 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32  ExprList..*/.u32
df10: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
df20: 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72  Flags(const Expr
df30: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
df40: 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d  int i;.  u32 m =
df50: 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   0;.  if( pList 
df60: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
df70: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
df80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45 78 70  i++){.       Exp
df90: 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
dfa0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
dfb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
dfc0: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
dfd0: 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67  m |= pExpr->flag
dfe0: 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  s;.    }.  }.  r
dff0: 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn m;.}../*.*
e000: 2a 20 54 68 69 73 20 69 73 20 61 20 53 45 4c 45  * This is a SELE
e010: 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b  CT-node callback
e020: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
e030: 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61 74 0a  ion walker that.
e040: 2a 2a 20 61 6c 77 61 79 73 20 22 66 61 69 6c 73  ** always "fails
e050: 22 2e 20 20 42 79 20 22 66 61 69 6c 22 20 69 6e  ".  By "fail" in
e060: 20 74 68 69 73 20 63 61 73 65 2c 20 77 65 20 6d   this case, we m
e070: 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b  ean set.** pWalk
e080: 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72  er->eCode to zer
e090: 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a  o and abort..**.
e0a0: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b  ** This callback
e0b0: 20 69 73 20 75 73 65 64 20 62 79 20 6d 75 6c 74   is used by mult
e0c0: 69 70 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20  iple expression 
e0d0: 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20  walkers..*/.int 
e0e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
e0f0: 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57  kFail(Walker *pW
e100: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
e110: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
e120: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
e130: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
e140: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65  >eCode = 0;.  re
e150: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
e160: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72  }../*.** These r
e170: 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b  outines are Walk
e180: 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65  er callbacks use
e190: 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65  d to check expre
e1a0: 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65  ssions to.** see
e1b0: 20 69 66 20 74 68 65 79 20 61 72 65 20 22 63 6f   if they are "co
e1c0: 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65  nstant" for some
e1d0: 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63   definition of c
e1e0: 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a  onstant.  The.**
e1f0: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
e200: 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74  lue determines t
e210: 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73  he type of "cons
e220: 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f  tant" we are loo
e230: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a  king.** for..**.
e240: 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63  ** These callbac
e250: 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  k routines are u
e260: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
e270: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
e280: 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
e290: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
e2a0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
e2b0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e2c0: 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==1.**     sqli
e2d0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
e2e0: 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20  tNotJoin()      
e2f0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
e300: 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71  ode==2.**     sq
e310: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
e320: 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20  Constant()      
e330: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
e340: 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20  eCode==3.**     
e350: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
e360: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
e370: 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  )        pWalker
e380: 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a  ->eCode==4 or 5.
e390: 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73  **.** In all cas
e3a0: 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  es, the callback
e3b0: 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f  s set Walker.eCo
e3c0: 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69  de=0 and abort i
e3d0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e3e0: 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  .** is found to 
e3f0: 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  not be a constan
e400: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  t..**.** The sql
e410: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
e420: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69  ntOrFunction() i
e430: 73 20 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75  s used for evalu
e440: 61 74 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  ating expression
e450: 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  s.** in a CREATE
e460: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
e470: 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43  .  The Walker.eC
e480: 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35 20 77  ode value is 5 w
e490: 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61  hen parsing.** a
e4a0: 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d  n existing schem
e4b0: 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f  a and 4 when pro
e4c0: 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74  cessing a new st
e4d0: 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e  atement.  A boun
e4e0: 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72  d.** parameter r
e4f0: 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66  aises an error f
e500: 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74  or new statement
e510: 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74  s, but is silent
e520: 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ly converted.** 
e530: 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73  to NULL for exis
e540: 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54  ting schemas.  T
e550: 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74  his allows sqlit
e560: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
e570: 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  that .** contain
e580: 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74   a bound paramet
e590: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 79 20  er because they 
e5a0: 77 65 72 65 20 67 65 6e 65 72 61 74 65 64 20 62  were generated b
e5b0: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
e5c0: 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f  .** of SQLite to
e5d0: 20 62 65 20 70 61 72 73 65 64 20 62 79 20 6e 65   be parsed by ne
e5e0: 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
e5f0: 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72  SQLite without r
e600: 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66  aising a.** malf
e610: 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72  ormed schema err
e620: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
e630: 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  t exprNodeIsCons
e640: 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  tant(Walker *pWa
e650: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
e660: 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61  r){..  /* If pWa
e670: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32  lker->eCode is 2
e680: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
e690: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e6a0: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
e6b0: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
e6c0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
e6d0: 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73   a left join dis
e6e0: 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78  qualifies the ex
e6f0: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72  pression.  ** fr
e700: 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  om being conside
e710: 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f  red constant. */
e720: 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  .  if( pWalker->
e730: 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72  eCode==2 && Expr
e740: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
e750: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
e760: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
e770: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72  eCode = 0;.    r
e780: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
e790: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
e7a0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
e7b0: 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e   /* Consider fun
e7c0: 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e  ctions to be con
e7d0: 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65  stant if all the
e7e0: 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ir arguments are
e7f0: 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a   constant.    **
e800: 20 61 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c   and either pWal
e810: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
e820: 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69   5 or the functi
e830: 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a  on has the.    *
e840: 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  * SQLITE_FUNC_CO
e850: 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20  NST flag. */.   
e860: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
e870: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  N:.      if( pWa
e880: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c  lker->eCode>=4 |
e890: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
e8a0: 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74  y(pExpr,EP_Const
e8b0: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
e8c0: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
e8d0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
e8e0: 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  e{.        pWalk
e8f0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
e900: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
e910: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
e920: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
e930: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
e940: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
e950: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
e960: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
e970: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73  OLUMN:.      tes
e980: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
e990: 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20  ==TK_ID );.     
e9a0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
e9b0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
e9c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
e9d0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
e9e0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
e9f0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ea00: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
ea10: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
ea20: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
ea30: 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78 70  eCode==3 && pExp
ea40: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
ea50: 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20  er->u.iCur ){.  
ea60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
ea70: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
ea80: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
ea90: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
eaa0: 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  case TK_IF_NULL_
eab0: 52 4f 57 3a 0a 20 20 20 20 20 20 74 65 73 74 63  ROW:.      testc
eac0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
ead0: 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29  TK_IF_NULL_ROW )
eae0: 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d  ;.      pWalker-
eaf0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
eb00: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
eb10: 72 74 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  rt;.    case TK_
eb20: 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
eb30: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
eb40: 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  de==5 ){.       
eb50: 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e   /* Silently con
eb60: 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61 6d  vert bound param
eb70: 65 74 65 72 73 20 74 68 61 74 20 61 70 70 65 61  eters that appea
eb80: 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45 41  r inside of CREA
eb90: 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  TE.        ** st
eba0: 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20  atements into a 
ebb0: 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69 6e  NULL when parsin
ebc0: 67 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  g the CREATE sta
ebd0: 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74 0a  tement text out.
ebe0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
ebf0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
ec00: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
ec10: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
ec20: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  NULL;.      }els
ec30: 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65  e if( pWalker->e
ec40: 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20  Code==4 ){.     
ec50: 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61     /* A bound pa
ec60: 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52 45  rameter in a CRE
ec70: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ATE statement th
ec80: 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
ec90: 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71  om.        ** sq
eca0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
ecb0: 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72 20  causes an error 
ecc0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  */.        pWalk
ecd0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
ece0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
ecf0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
ed00: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
ed10: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64 65  hrough */.    de
ed20: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73  fault:.      tes
ed30: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
ed40: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f  ==TK_SELECT ); /
ed50: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  * sqlite3SelectW
ed60: 61 6c 6b 46 61 69 6c 20 77 69 6c 6c 20 64 69 73  alkFail will dis
ed70: 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74  allow */.      t
ed80: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
ed90: 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
eda0: 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63   /* sqlite3Selec
edb0: 74 57 61 6c 6b 46 61 69 6c 20 77 69 6c 6c 20 64  tWalkFail will d
edc0: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
edd0: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
ede0: 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  inue;.  }.}.stat
edf0: 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e  ic int exprIsCon
ee00: 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  st(Expr *p, int 
ee10: 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43  initFlag, int iC
ee20: 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ur){.  Walker w;
ee30: 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69  .  w.eCode = ini
ee40: 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72  tFlag;.  w.xExpr
ee50: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
ee60: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
ee70: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
ee80: 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ck = sqlite3Sele
ee90: 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64  ctWalkFail;.#ifd
eea0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
eeb0: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
eec0: 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65  ack2 = sqlite3Se
eed0: 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b  lectWalkAssert2;
eee0: 0a 23 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43  .#endif.  w.u.iC
eef0: 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c  ur = iCur;.  sql
ef00: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
ef10: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
ef20: 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
ef30: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
ef40: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
ef50: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
ef60: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
ef70: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
ef80: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
ef90: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
efa0: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
efb0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
efc0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
efd0: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
efe0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
eff0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
f000: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
f010: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
f020: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
f030: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
f040: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
f050: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
f060: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
f070: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
f080: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20  prIsConst(p, 1, 
f090: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
f0a0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
f0b0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
f0c0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
f0d0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
f0e0: 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65  tant.** that doe
f0f0: 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66  s no originate f
f100: 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
f110: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
f120: 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e   join..** Return
f130: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
f140: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
f150: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72  unction calls or
f160: 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61   terms from.** a
f170: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
f180: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
f190: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
f1a0: 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a  ntNotJoin(Expr *
f1b0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
f1c0: 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30  rIsConst(p, 2, 0
f1d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
f1e0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
f1f0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
f200: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
f210: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
f220: 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73  ant.** for any s
f230: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
f240: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
f250: 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68  or iCur.  In oth
f260: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a  er words, the.**
f270: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
f280: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e   not refer to an
f290: 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  y non-determinis
f2a0: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  tic function nor
f2b0: 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74   any.** table ot
f2c0: 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a  her than iCur..*
f2d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f2e0: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
f2f0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43  (Expr *p, int iC
f300: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  ur){.  return ex
f310: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20  prIsConst(p, 3, 
f320: 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  iCur);.}.../*.**
f330: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
f340: 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  () callback used
f350: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 49   by sqlite3ExprI
f360: 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
f370: 42 79 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  By()..*/.static 
f380: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
f390: 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28  nstantOrGroupBy(
f3a0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
f3b0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
f3c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
f3d0: 70 42 79 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pBy = pWalker->u
f3e0: 2e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 6e 74  .pGroupBy;.  int
f3f0: 20 69 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   i;..  /* Check 
f400: 69 66 20 70 45 78 70 72 20 69 73 20 69 64 65 6e  if pExpr is iden
f410: 74 69 63 61 6c 20 74 6f 20 61 6e 79 20 47 52 4f  tical to any GRO
f420: 55 50 20 42 59 20 74 65 72 6d 2e 20 49 66 20 73  UP BY term. If s
f430: 6f 2c 20 63 6f 6e 73 69 64 65 72 0a 20 20 2a 2a  o, consider.  **
f440: 20 69 74 20 63 6f 6e 73 74 61 6e 74 2e 20 20 2a   it constant.  *
f450: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
f460: 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
f470: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
f480: 70 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  p = pGroupBy->a[
f490: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
f4a0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
f4b0: 70 61 72 65 28 30 2c 20 70 45 78 70 72 2c 20 70  pare(0, pExpr, p
f4c0: 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20  , -1)<2 ){.     
f4d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
f4e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
f4f0: 6c 53 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70 50  lSeq(pWalker->pP
f500: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
f510: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( pColl==0 || 
f520: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
f530: 22 42 49 4e 41 52 59 22 2c 20 70 43 6f 6c 6c 2d  "BINARY", pColl-
f540: 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  >zName)==0 ){.  
f550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f560: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
f570: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
f580: 43 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69  Check if pExpr i
f590: 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
f5a0: 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 20  If so, consider 
f5b0: 69 74 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f 0a  it variable. */.
f5c0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
f5d0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f5e0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
f5f0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
f600: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
f610: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
f620: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 4e 6f  .  return exprNo
f630: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 61  deIsConstant(pWa
f640: 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  lker, pExpr);.}.
f650: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20  ./*.** Walk the 
f660: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
f670: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
f680: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65  rst argument. Re
f690: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  turn non-zero.**
f6a0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
f6b0: 6f 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  on consists enti
f6c0: 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74  rely of constant
f6d0: 73 20 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 74  s or copies of t
f6e0: 65 72 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72 6f  erms .** in pGro
f6f0: 75 70 42 79 20 74 68 61 74 20 73 6f 72 74 20 77  upBy that sort w
f700: 69 74 68 20 74 68 65 20 42 49 4e 41 52 59 20 63  ith the BINARY c
f710: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
f720: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
f730: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
f740: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20   determine if a 
f750: 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49  term of the HAVI
f760: 4e 47 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a 2a  NG clause can.**
f770: 20 62 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 74   be promoted int
f780: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
f790: 73 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 66 6f  se.  In order fo
f7a0: 72 20 73 75 63 68 20 61 20 70 72 6f 6d 6f 74 69  r such a promoti
f7b0: 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74  on to work,.** t
f7c0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
f7d0: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 74 65  HAVING clause te
f7e0: 72 6d 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  rm must be the s
f7f0: 61 6d 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 62  ame for all memb
f800: 65 72 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72 6f  ers of.** a "gro
f810: 75 70 22 2e 20 20 54 68 65 20 72 65 71 75 69 72  up".  The requir
f820: 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 47  ement that the G
f830: 52 4f 55 50 20 42 59 20 74 65 72 6d 20 6d 75 73  ROUP BY term mus
f840: 74 20 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20 61  t be BINARY.** a
f850: 73 73 75 6d 65 73 20 74 68 61 74 20 6e 6f 20 6f  ssumes that no o
f860: 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ther collating s
f870: 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 68 61 76  equence will hav
f880: 65 20 61 20 66 69 6e 65 72 2d 67 72 61 69 6e 65  e a finer-graine
f890: 64 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74 68  d.** grouping th
f8a0: 61 6e 20 62 69 6e 61 72 79 2e 20 20 49 6e 20 6f  an binary.  In o
f8b0: 74 68 65 72 20 77 6f 72 64 73 20 28 41 3d 42 20  ther words (A=B 
f8c0: 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 29 20  COLLATE binary) 
f8d0: 69 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20 69  implies.** A=B i
f8e0: 6e 20 65 76 65 72 79 20 6f 74 68 65 72 20 63 6f  n every other co
f8f0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f900: 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d 65  .  The requireme
f910: 6e 74 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 47  nt that the.** G
f920: 52 4f 55 50 20 42 59 20 62 65 20 42 49 4e 41 52  ROUP BY be BINAR
f930: 59 20 69 73 20 73 74 72 69 63 74 65 72 20 74 68  Y is stricter th
f940: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 20 49  an necessary.  I
f950: 74 20 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f 72  t would also wor
f960: 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65 20  k.** to promote 
f970: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 74  HAVING clauses t
f980: 68 61 74 20 75 73 65 20 74 68 65 20 73 61 6d 65  hat use the same
f990: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
f9a0: 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
f9b0: 63 65 20 61 73 20 74 68 65 20 47 52 4f 55 50 20  ce as the GROUP 
f9c0: 42 59 20 74 65 72 6d 2c 20 62 75 74 20 74 68 61  BY term, but tha
f9d0: 74 20 69 73 20 6d 75 63 68 20 68 61 72 64 65 72  t is much harder
f9e0: 20 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c   to check,.** al
f9f0: 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
fa00: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 72  ing sequences ar
fa10: 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20  e uncommon, and 
fa20: 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e 0a  this is only an.
fa30: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ** optimization,
fa40: 20 73 6f 20 77 65 20 74 61 6b 65 20 74 68 65 20   so we take the 
fa50: 65 61 73 79 20 77 61 79 20 6f 75 74 20 61 6e 64  easy way out and
fa60: 20 73 69 6d 70 6c 79 20 72 65 71 75 69 72 65 20   simply require 
fa70: 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20  the.** GROUP BY 
fa80: 74 6f 20 75 73 65 20 74 68 65 20 42 49 4e 41 52  to use the BINAR
fa90: 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  Y collating sequ
faa0: 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ence..*/.int sql
fab0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
fac0: 6e 74 4f 72 47 72 6f 75 70 42 79 28 50 61 72 73  ntOrGroupBy(Pars
fad0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
fae0: 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 47  *p, ExprList *pG
faf0: 72 6f 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b 65  roupBy){.  Walke
fb00: 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  r w;.  w.eCode =
fb10: 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   1;.  w.xExprCal
fb20: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
fb30: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75  IsConstantOrGrou
fb40: 70 42 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  pBy;.  w.xSelect
fb50: 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Callback = 0;.  
fb60: 77 2e 75 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  w.u.pGroupBy = p
fb70: 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50 61  GroupBy;.  w.pPa
fb80: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
fb90: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
fba0: 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
fbb0: 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   w.eCode;.}../*.
fbc0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
fbd0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
fbe0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
fbf0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
fc00: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72  s constant.** or
fc10: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
fc20: 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61   with constant a
fc30: 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72  rguments.  Retur
fc40: 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65  n and 0 if there
fc50: 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69  .** are any vari
fc60: 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ables..**.** For
fc70: 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
fc80: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
fc90: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
fca0: 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63  string (ex: "abc
fcb0: 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ").** is conside
fcc0: 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62  red a variable b
fcd0: 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74  ut a single-quot
fce0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27  ed string (ex: '
fcf0: 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f  abc') is.** a co
fd00: 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  nstant..*/.int s
fd10: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
fd20: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45  tantOrFunction(E
fd30: 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69  xpr *p, u8 isIni
fd40: 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  t){.  assert( is
fd50: 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69  Init==0 || isIni
fd60: 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==1 );.  return
fd70: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
fd80: 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a  4+isInit, 0);.}.
fd90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
fda0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
fdb0: 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  TS./*.** Walk an
fdc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
fdd0: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
fde0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  he expression co
fdf0: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71  ntains a.** subq
fe00: 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  uery of some kin
fe10: 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
fe20: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62  there are no sub
fe30: 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20  queries..*/.int 
fe40: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61  sqlite3ExprConta
fe50: 69 6e 73 53 75 62 71 75 65 72 79 28 45 78 70 72  insSubquery(Expr
fe60: 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77   *p){.  Walker w
fe70: 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b  ;.  w.eCode = 1;
fe80: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
fe90: 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
fea0: 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53  WalkNoop;.  w.xS
feb0: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
fec0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
fed0: 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51  kFail;.#ifdef SQ
fee0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78  LITE_DEBUG.  w.x
fef0: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
ff00: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  = sqlite3SelectW
ff10: 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64  alkAssert2;.#end
ff20: 69 66 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  if.  sqlite3Walk
ff30: 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
ff40: 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30  eturn w.eCode==0
ff50: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
ff60: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
ff70: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
ff80: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
ff90: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
ffa0: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
ffb0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
ffc0: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
ffd0: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
ffe0: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
fff0: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
10000 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
10010 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
10020 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
10030 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
10040 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
10050 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
10060 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
10070 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
10080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
10090 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
100a0 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
100b0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  e){.  int rc = 0
100c0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
100d0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e  eturn 0;  /* Can
100e0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c   only happen fol
100f0 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f  lowing on OOM */
10100 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70  ..  /* If an exp
10110 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e  ression is an in
10120 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68  teger literal th
10130 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69 67  at fits in a sig
10140 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20  ned 32-bit.  ** 
10150 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68  integer, then th
10160 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
10170 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  ag will have alr
10180 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f  eady been set */
10190 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
101a0 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  !=TK_INTEGER || 
101b0 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  (p->flags & EP_I
101c0 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20  ntValue)!=0.    
101d0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
101e0 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a  3GetInt32(p->u.z
101f0 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29  Token, &rc)==0 )
10200 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  ;..  if( p->flag
10210 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
10220 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d  ){.    *pValue =
10230 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20   p->u.iValue;.  
10240 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
10250 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
10260 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  ){.    case TK_U
10270 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63  PLUS: {.      rc
10280 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73   = sqlite3ExprIs
10290 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
102a0 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , pValue);.     
102b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
102c0 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
102d0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
102e0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
102f0 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
10300 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
10310 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10320 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37   v!=(-2147483647
10330 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  -1) );.        *
10340 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
10350 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
10360 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
10370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
10380 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ult: break;.  }.
10390 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
103a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c  /*.** Return FAL
103b0 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  SE if there is n
103c0 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
103d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
103e0 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   be NULL..**.** 
103f0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
10400 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  n might be NULL 
10410 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73  or if the expres
10420 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70  sion is too comp
10430 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72  lex.** to tell r
10440 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a  eturn TRUE.  .**
10450 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10460 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f   is used as an o
10470 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20  ptimization, to 
10480 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f  skip OP_IsNull o
10490 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77  pcodes.** when w
104a0 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61  e know that a va
104b0 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55  lue cannot be NU
104c0 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61  LL.  Hence, a fa
104d0 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20  lse positive.** 
104e0 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20  (returning TRUE 
104f0 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65  when in fact the
10500 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
10510 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d  never be NULL) m
10520 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61  ight.** be a sma
10530 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  ll performance h
10540 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72 77  it but is otherw
10550 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f  ise harmless.  O
10560 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68  n the other.** h
10570 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67  and, a false neg
10580 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67  ative (returning
10590 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20   FALSE when the 
105a0 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20  result could be 
105b0 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69  NULL).** will li
105c0 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
105d0 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77  n incorrect answ
105e0 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20  er.  So when in 
105f0 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a  doubt, return.**
10600 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71   TRUE..*/.int sq
10610 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
10620 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ll(const Expr *p
10630 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68  ){.  u8 op;.  wh
10640 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
10650 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  PLUS || p->op==T
10660 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20  K_UMINUS ){ p = 
10670 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70  p->pLeft; }.  op
10680 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
10690 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
106a0 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
106b0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
106c0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
106d0 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ER:.    case TK_
106e0 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65  STRING:.    case
106f0 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
10700 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20  ase TK_BLOB:.   
10710 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
10720 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
10730 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 45 78  .      return Ex
10740 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
10750 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c   EP_CanBeNull) |
10760 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  |.             p
10770 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a  ->pTab==0 ||  /*
10780 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f   Reference to co
10790 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e  lumn of index on
107a0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
107b0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e              (p->
107c0 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d  iColumn>=0 && p-
107d0 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69  >pTab->aCol[p->i
107e0 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
107f0 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  =0);.    default
10800 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
10810 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
10820 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
10830 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
10840 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  on is a constant
10850 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a   which would be.
10860 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20  ** unchanged by 
10870 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68  OP_Affinity with
10880 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67 69   the affinity gi
10890 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
108a0 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
108b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
108c0 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
108d0 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50  ermine if the OP
108e0 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74  _Affinity operat
108f0 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d  ion.** can be om
10900 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20  itted.  When in 
10910 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c  doubt return FAL
10920 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67  SE.  A false neg
10930 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d  ative.** is harm
10940 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70  less.  A false p
10950 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72  ositive, however
10960 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20  , can result in 
10970 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73  the wrong.** ans
10980 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wer..*/.int sqli
10990 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
109a0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e  finityChange(con
109b0 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72  st Expr *p, char
109c0 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a   aff){.  u8 op;.
109d0 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54    if( aff==SQLIT
109e0 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65 74  E_AFF_BLOB ) ret
109f0 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  urn 1;.  while( 
10a00 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
10a10 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
10a20 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
10a30 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
10a40 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
10a50 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
10a60 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
10a70 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
10a80 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
10a90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
10aa0 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
10ab0 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
10ac0 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
10ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10ae0 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
10af0 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
10b00 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c  QLITE_AFF_REAL |
10b10 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
10b20 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
10b30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
10b40 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ING: {.      ret
10b50 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
10b60 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a  AFF_TEXT;.    }.
10b70 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
10b80 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
10b90 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
10ba0 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
10bb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
10bc0 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f  >iTable>=0 );  /
10bd0 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61  * p cannot be pa
10be0 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f  rt of a CHECK co
10bf0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
10c00 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c    return p->iCol
10c10 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20  umn<0.          
10c20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
10c30 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
10c40 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
10c50 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20  UMERIC);.    }. 
10c60 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
10c70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
10c80 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
10c90 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10ca0 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
10cb0 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
10cc0 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
10cd0 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
10ce0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
10cf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
10d00 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
10d10 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
10d20 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
10d30 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
10d40 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
10d50 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
10d60 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
10d70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
10d80 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
10d90 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20 52  *.** pX is the R
10da0 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72  HS of an IN oper
10db0 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73 20  ator.  If pX is 
10dc0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
10dd0 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20  nt .** that can 
10de0 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74 6f  be simplified to
10df0 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20   a direct table 
10e00 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65 74  access, then ret
10e10 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
10e20 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73   to the SELECT s
10e30 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 58  tatement.  If pX
10e40 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43 54   is not a SELECT
10e50 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f   statement,.** o
10e60 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  r if the SELECT 
10e70 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20  statement needs 
10e80 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64  to be manifested
10e90 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65 6e   into a transien
10ea0 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e  t.** table, then
10eb0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
10ec0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10ed0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74  OMIT_SUBQUERY.st
10ee0 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73 43  atic Select *isC
10ef0 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
10f00 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53 65  (Expr *pX){.  Se
10f10 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69  lect *p;.  SrcLi
10f20 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72  st *pSrc;.  Expr
10f30 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
10f40 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
10f50 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70  nt i;.  if( !Exp
10f60 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
10f70 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
10f80 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e   return 0;  /* N
10f90 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  ot a subquery */
10fa0 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
10fb0 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61  operty(pX, EP_Va
10fc0 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74 75  rSelect)  ) retu
10fd0 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c  rn 0;  /* Correl
10fe0 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70  ated subq */.  p
10ff0 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   = pX->x.pSelect
11000 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
11010 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  r ) return 0;   
11020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
11030 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  t a compound SEL
11040 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
11050 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
11060 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
11070 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73  gate) ){.    tes
11080 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
11090 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
110a0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
110b0 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
110c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
110d0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
110e0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
110f0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
11100 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
11110 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20  return 0; /* No 
11120 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
11130 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74   and no aggregat
11140 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
11150 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
11160 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20  pGroupBy==0 );  
11170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
11180 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
11190 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
111a0 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
111b0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
111c0 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49    /* Has no LIMI
111d0 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73  T clause */.  as
111e0 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
111f0 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
11200 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54       /* No LIMIT
11210 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54   means no OFFSET
11220 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
11230 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11250 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  Has no WHERE cla
11260 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  use */.  pSrc = 
11270 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
11280 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
11290 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
112a0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
112b0 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
112c0 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c   term in FROM cl
112d0 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
112e0 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
112f0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
11300 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20   /* FROM is not 
11310 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69  a subquery or vi
11320 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70  ew */.  pTab = p
11330 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
11340 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
11350 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
11360 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
11370 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
11380 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
11390 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  not a view */.  
113a0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
113b0 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ab) ) return 0; 
113c0 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
113d0 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74  lause not a virt
113e0 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  ual table */.  p
113f0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
11400 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  t;.  assert( pEL
11410 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41  ist!=0 );.  /* A
11420 6c 6c 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  ll SELECT result
11430 73 20 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e  s must be column
11440 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  s. */.  for(i=0;
11450 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
11460 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
11470 20 2a 70 52 65 73 20 3d 20 70 45 4c 69 73 74 2d   *pRes = pEList-
11480 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
11490 20 69 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54   if( pRes->op!=T
114a0 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
114b0 6e 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  n 0;.    assert(
114c0 20 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70   pRes->iTable==p
114d0 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  Src->a[0].iCurso
114e0 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63  r );  /* Not a c
114f0 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
11500 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ry */.  }.  retu
11510 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn p;.}.#endif /
11520 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
11530 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
11540 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
11550 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
11560 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
11570 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74   checks the left
11580 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
11590 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75 72  index table iCur
115a0 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74   to see if.** it
115b0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
115c0 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75  LL entries.  Cau
115d0 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  se the register 
115e0 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f  at regHasNull to
115f0 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20   be set.** to a 
11600 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
11610 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  f iCur contains 
11620 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65  no NULLs.  Cause
11630 20 72 65 67 69 73 74 65 72 20 72 65 67 48 61 73   register regHas
11640 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65  Null.** to be se
11650 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75  t to NULL if iCu
11660 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  r contains one o
11670 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
11680 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
11690 69 64 20 73 71 6c 69 74 65 33 53 65 74 48 61 73  id sqlite3SetHas
116a0 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76  NullFlag(Vdbe *v
116b0 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20  , int iCur, int 
116c0 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69  regHasNull){.  i
116d0 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71 6c 69  nt addr1;.  sqli
116e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
116f0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
11700 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61  regHasNull);.  a
11710 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
11720 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
11730 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20 56 64  ewind, iCur); Vd
11740 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
11750 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11760 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
11770 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48 61 73   iCur, 0, regHas
11780 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  Null);.  sqlite3
11790 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
117a0 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
117b0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
117c0 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e 74 72  ((v, "first_entr
117d0 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75 72 29  y_in(%d)", iCur)
117e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
117f0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11800 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  1);.}.#endif...#
11810 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11820 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
11830 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
11840 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
11850 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f   with a list (no
11860 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e  t a subquery) on
11870 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   the .** right-h
11880 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72  and side.  Retur
11890 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c  n TRUE if that l
118a0 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  ist is constant.
118b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
118c0 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
118d0 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29  stant(Expr *pIn)
118e0 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a  {.  Expr *pLHS;.
118f0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73    int res;.  ass
11900 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
11910 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49  perty(pIn, EP_xI
11920 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c  sSelect) );.  pL
11930 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b  HS = pIn->pLeft;
11940 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
11950 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74  0;.  res = sqlit
11960 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
11970 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c  (pIn);.  pIn->pL
11980 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65  eft = pLHS;.  re
11990 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64  turn res;.}.#end
119a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
119b0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
119c0 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
119d0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20  ation of the IN 
119e0 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a  (...) operator..
119f0 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65  ** The pX parame
11a00 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65  ter is the expre
11a10 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53  ssion on the RHS
11a20 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
11a30 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69  tor, which.** mi
11a40 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20  ght be either a 
11a50 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
11a60 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72  ons or a subquer
11a70 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  y..**.** The job
11a80 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
11a90 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
11aa0 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f  reate a b-tree o
11ab0 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a  bject that can.*
11ac0 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72  * be used either
11ad0 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d   to test for mem
11ae0 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52  bership in the R
11af0 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65  HS set or to ite
11b00 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
11b10 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74  all members of t
11b20 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70  he RHS set, skip
11b30 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e  ping duplicates.
11b40 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20  .**.** A cursor 
11b50 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  is opened on the
11b60 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
11b70 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f  hat is the RHS o
11b80 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
11b90 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61  r.** and pX->iTa
11ba0 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
11bb0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
11bc0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
11bd0 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
11be0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
11bf0 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  n indicates the 
11c00 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20  b-tree type, as 
11c10 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
11c20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
11c30 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
11c40 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
11c50 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
11c60 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
11c70 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65  INDEX_ASC  - The
11c80 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
11c90 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  ed on an ascendi
11ca0 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49  ng index..**   I
11cb0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
11cc0 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  SC - The cursor 
11cd0 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
11ce0 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
11cf0 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
11d00 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65  EPH        - The
11d10 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
11d20 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c  ed on a speciall
11d30 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  y created and.**
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d50 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74           populat
11d60 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ed epheremal tab
11d70 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
11d80 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e  X_NOOP       - N
11d90 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c  o cursor was all
11da0 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20  ocated.  The IN 
11db0 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
11dc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c              impl
11de0 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71  emented as a seq
11df0 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
11e00 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  sons..**.** An e
11e10 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
11e20 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20  ight be used if 
11e30 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69  the RHS expressi
11e40 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c  on pX is a simpl
11e50 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75  e.** subquery su
11e60 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ch as:.**.**    
11e70 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31   SELECT <column1
11e80 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20  >, <column2>... 
11e90 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
11ea0 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66  ** If the RHS of
11eb0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
11ec0 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20   is a list or a 
11ed0 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62  more complex sub
11ee0 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61  query, then.** a
11ef0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
11f00 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
11f10 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  be generated fro
11f20 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68  m the RHS and th
11f30 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65  en.** pX->iTable
11f40 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
11f50 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  o the ephemeral 
11f60 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66  table instead of
11f70 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20   an.** existing 
11f80 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
11f90 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74   inFlags paramet
11fa0 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  er must contain 
11fb0 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  exactly one of t
11fc0 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
11fd0 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
11fe0 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e  r IN_INDEX_LOOP.
11ff0 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e    If inFlags con
12000 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45  tains.** IN_INDE
12010 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68  X_MEMBERSHIP, th
12020 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  en the generated
12030 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75   table will be u
12040 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73  sed for a.** fas
12050 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
12060 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f  t.  When the IN_
12070 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69  INDEX_LOOP bit i
12080 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e  s set, the.** IN
12090 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75   index will be u
120a0 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72  sed to loop over
120b0 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74   all values of t
120c0 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a  he RHS of the.**
120d0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a   IN operator..**
120e0 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
120f0 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28  X_LOOP is used (
12100 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
12110 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
12120 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67  terate.** throug
12130 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  h the set member
12140 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  s) then the b-tr
12150 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74  ee must not cont
12160 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ain duplicates..
12170 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20  ** An epheremal 
12180 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73  table must be us
12190 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65  ed unless the se
121a0 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61  lected columns a
121b0 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  re guaranteed.**
121c0 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20   to be unique - 
121d0 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69  either because i
121e0 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  t is an INTEGER 
121f0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 64  PRIMARY KEY or d
12200 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55  ue to.** a UNIQU
12210 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20  E constraint or 
12220 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  index..**.** Whe
12230 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  n IN_INDEX_MEMBE
12240 52 53 48 49 50 20 69 73 20 75 73 65 64 20 28 61  RSHIP is used (a
12250 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  nd the b-tree wi
12260 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ll be used .** f
12270 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62  or fast set memb
12280 65 72 73 68 69 70 20 74 65 73 74 73 29 20 74 68  ership tests) th
12290 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20  en an epheremal 
122a0 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62  table must .** b
122b0 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63  e used unless <c
122c0 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e  olumns> is a sin
122d0 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  gle INTEGER PRIM
122e0 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f  ARY KEY column o
122f0 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63  r an .** index c
12300 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68  an be found with
12310 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 3c   the specified <
12320 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73 20  columns> as its 
12330 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a  left-most..**.**
12340 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58   If the IN_INDEX
12350 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f  _NOOP_OK and IN_
12360 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
12370 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e   are both set an
12380 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20  d.** if the RHS 
12390 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
123a0 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f  or is a list (no
123b0 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74 68  t a subquery) th
123c0 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
123d0 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65 20  ne might decide 
123e0 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e  that creating an
123f0 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65   ephemeral b-tre
12400 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  e for membership
12410 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74  .** testing is t
12420 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64  oo expensive and
12430 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58   return IN_INDEX
12440 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20  _NOOP.  In that 
12450 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c  case, the.** cal
12460 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f  ling routine sho
12470 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  uld implement th
12480 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73  e IN operator us
12490 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a  ing a sequence.*
124a0 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f  * of Eq or Ne co
124b0 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
124c0 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ons..**.** When 
124d0 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65  the b-tree is be
124e0 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d  ing used for mem
124f0 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74  bership tests, t
12500 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
12510 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65  ion.** might nee
12520 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65  d to know whethe
12530 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53  r or not the RHS
12540 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
12550 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74  operator.** cont
12560 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66  ains a NULL.  If
12570 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73   prRhsHasNull is
12580 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e   not a NULL poin
12590 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74  ter and .** if t
125a0 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e  here is any chan
125b0 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
125c0 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  ) might contain 
125d0 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a  a NULL value at.
125e0 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e  ** runtime, then
125f0 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
12600 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
12610 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
12620 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a   written.** to *
12630 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66  prRhsHasNull. If
12640 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
12650 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
12660 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  .) contains a.**
12670 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65   NULL value, the
12680 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  n *prRhsHasNull 
12690 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
126a0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  d..**.** If a re
126b0 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
126c0 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61  ted and its loca
126d0 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a  tion stored in *
126e0 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68  prRhsHasNull, th
126f0 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  en.** the value 
12700 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72  in that register
12710 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
12720 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
12730 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
12740 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  .** NULL values,
12750 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20   and it will be 
12760 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  some non-NULL va
12770 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65  lue if the b-tre
12780 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a  e contains no.**
12790 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a   NULL values..**
127a0 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61 70  .** If the aiMap
127b0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
127c0 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20  t NULL, it must 
127d0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61  point to an arra
127e0 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20  y containing.** 
127f0 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20  one element for 
12800 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75  each column retu
12810 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  rned by the SELE
12820 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
12830 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68  the RHS.** of th
12840 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  e IN(...) operat
12850 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e 74  or. The i'th ent
12860 72 79 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ry of the array 
12870 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
12880 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20  h the.** offset 
12890 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  of the index col
128a0 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73  umn that matches
128b0 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e   the i'th column
128c0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
128d0 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72 20  .** SELECT. For 
128e0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
128f0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
12900 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61 72  elected index ar
12910 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c  e:.**.**   (?,?,
12920 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c  ?) IN (SELECT a,
12930 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a   b, c FROM t1).*
12940 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
12950 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20   i1 ON t1(b, c, 
12960 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61  a);.**.** then a
12970 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61  iMap[] is popula
12980 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c 20  ted with {2, 0, 
12990 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  1}..*/.#ifndef S
129a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
129b0 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  ERY.int sqlite3F
129c0 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50 61  indInIndex(.  Pa
129d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
129e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
129f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
12a00 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20 20   Expr *pX,      
12a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12a20 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
12a30 64 65 20 28 52 48 53 29 20 6f 66 20 74 68 65 20  de (RHS) of the 
12a40 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
12a50 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20 20   u32 inFlags,   
12a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12a70 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d  N_INDEX_LOOP, _M
12a80 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f  EMBERSHIP, and/o
12a90 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20  r _NOOP_OK */.  
12aa0 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  int *prRhsHasNul
12ab0 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  l,         /* Re
12ac0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e  gister holding N
12ad0 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65 65  ULL status.  See
12ae0 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   notes */.  int 
12af0 2a 61 69 4d 61 70 20 20 20 20 20 20 20 20 20 20  *aiMap          
12b00 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
12b10 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69 65  g from Index fie
12b20 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c 64  lds to RHS field
12b30 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  s */.){.  Select
12b40 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b60 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65  /* SELECT to the
12b70 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65   right of IN ope
12b80 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65  rator */.  int e
12b90 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Type = 0;       
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bb0 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20   /* Type of RHS 
12bc0 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f  table. IN_INDEX_
12bd0 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  * */.  int iTab 
12be0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
12bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12c00 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48  Cursor of the RH
12c10 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  S table */.  int
12c20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20   mustBeUnique;  
12c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c40 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48     /* True if RH
12c50 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65  S must be unique
12c60 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
12c70 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12c80 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56  Parse);     /* V
12c90 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
12ca0 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20  eing coded */.. 
12cb0 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
12cc0 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74  =TK_IN );.  must
12cd0 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c  BeUnique = (inFl
12ce0 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c  ags & IN_INDEX_L
12cf0 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49  OOP)!=0;..  /* I
12d00 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 69  f the RHS of thi
12d10 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  s IN(...) operat
12d20 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20  or is a SELECT, 
12d30 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65 72  and if it matter
12d40 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  s .  ** whether 
12d50 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45 43  or not the SELEC
12d60 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e  T result contain
12d70 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63  s NULL values, c
12d80 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20 2a  heck whether.  *
12d90 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73  * or not NULL is
12da0 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62   actually possib
12db0 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20 62  le (it may not b
12dc0 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  e, for example, 
12dd0 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54  due .  ** to NOT
12de0 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
12df0 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 29  s in the schema)
12e00 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c  . If no NULL val
12e10 75 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ues are possible
12e20 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68 73  ,.  ** set prRhs
12e30 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66  HasNull to 0 bef
12e40 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  ore continuing. 
12e50 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73 48   */.  if( prRhsH
12e60 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66  asNull && (pX->f
12e70 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
12e80 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ect) ){.    int 
12e90 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  i;.    ExprList 
12ea0 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e  *pEList = pX->x.
12eb0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
12ec0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12ed0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
12ee0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
12ef0 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
12f00 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ull(pEList->a[i]
12f10 2e 70 45 78 70 72 29 20 29 20 62 72 65 61 6b 3b  .pExpr) ) break;
12f20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
12f30 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ==pEList->nExpr 
12f40 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48 61  ){.      prRhsHa
12f50 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  sNull = 0;.    }
12f60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
12f70 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78   to see if an ex
12f80 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
12f90 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
12fa0 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66  d to.  ** satisf
12fb0 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68  y the query.  Th
12fc0 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65  is is preferable
12fd0 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61   to generating a
12fe0 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d   new .  ** ephem
12ff0 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  eral table.  */.
13000 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
13010 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69 73  rr==0 && (p = is
13020 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
13030 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20 20  t(pX))!=0 ){.   
13040 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13050 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
13060 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
13070 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
13080 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
13090 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
130b0 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a  Table <table>. *
130c0 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20 20  /.    i16 iDb;  
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
130f0 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72  Database idx for
13100 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78 70   pTab */.    Exp
13110 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
13120 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  p->pEList;.    i
13130 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73  nt nExpr = pELis
13140 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61  t->nExpr;..    a
13150 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
13160 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
13170 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
13180 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
13190 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
131a0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
131b0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
131c0 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66  ); /* Because of
131d0 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
131e0 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
131f0 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d  ssert( p->pSrc!=
13200 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
13210 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
13220 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
13230 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70  nOpt(p) */.    p
13240 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
13250 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f  [0].pTab;..    /
13260 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61  * Code an OP_Tra
13270 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f  nsaction and OP_
13280 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74  TableLock for <t
13290 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44  able>. */.    iD
132a0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
132b0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
132c0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
132d0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
132e0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
132f0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
13300 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
13310 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
13320 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
13330 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65 72  ame);..    asser
13340 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65  t(v);  /* sqlite
13350 33 47 65 74 56 64 62 65 28 29 20 68 61 73 20 61  3GetVdbe() has a
13360 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65 76 69  lways been previ
13370 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a  ously called */.
13380 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31      if( nExpr==1
13390 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   && pEList->a[0]
133a0 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  .pExpr->iColumn<
133b0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
133c0 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  e "x IN (SELECT 
133d0 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65  rowid FROM table
133e0 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20  )" case */.     
133f0 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
13400 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
13410 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20  , OP_Once);.    
13420 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
13430 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
13440 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
13450 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
13460 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
13470 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
13480 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
13490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
134a0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
134b0 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
134c0 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
134d0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
134e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
134f0 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
13500 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
13510 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20  finity_ok = 1;. 
13520 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
13530 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
13540 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
13550 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
13560 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20  to perform each 
13570 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
13580 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
13590 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
135a0 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
135b0 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  in table.      *
135c0 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  * on the RHS of 
135d0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
135e0 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20    If it not, it 
135f0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
13600 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20  to.      ** use 
13610 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65  any index of the
13620 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a   RHS table.  */.
13630 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
13640 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69  <nExpr && affini
13650 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ty_ok; i++){.   
13660 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
13670 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
13680 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
13690 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
136a0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
136b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
136c0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
136d0 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d     char idxaff =
136e0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
136f0 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62  umnAffinity(pTab
13700 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74  ,iCol); /* RHS t
13710 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
13720 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71  char cmpaff = sq
13730 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
13740 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66  nity(pLhs, idxaf
13750 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  f);.        test
13760 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
13770 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
13780 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
13790 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
137a0 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
137b0 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d        switch( cm
137c0 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  paff ){.        
137d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
137e0 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20  F_BLOB:.        
137f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13800 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
13810 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
13820 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
13830 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
13840 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20  () only returns 
13850 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65  TEXT if one side
13860 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20   or the.        
13870 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73      ** other has
13880 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64   no affinity and
13890 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20   the other side 
138a0 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c  is TEXT.  Hence,
138b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
138c0 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72  the only way for
138d0 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45   cmpaff to be TE
138e0 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66  XT is for idxaff
138f0 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20   to be TEXT.    
13900 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66          ** and f
13910 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74  or the term on t
13920 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
13930 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69   to have no affi
13940 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nity. */.       
13950 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78       assert( idx
13960 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
13970 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
13980 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13990 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
139a0 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
139b0 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
139c0 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
139d0 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20  (idxaff);.      
139e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
139f0 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f     if( affinity_
13a00 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ok ){.        /*
13a10 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
13a20 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68  xisting index th
13a30 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72  at will work for
13a40 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
13a50 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  r */.        for
13a60 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
13a70 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
13a80 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d  e==0; pIdx=pIdx-
13a90 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
13aa0 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73     Bitmask colUs
13ab0 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ed;      /* Colu
13ac0 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
13ad0 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20   used */.       
13ae0 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b     Bitmask mCol;
13af0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
13b00 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
13b10 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20   column */.     
13b20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
13b30 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63  Column<nExpr ) c
13b40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
13b50 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43     /* Maximum nC
13b60 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20  olumn is BMS-2, 
13b70 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68  not BMS-1, so th
13b80 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74  at we can comput
13b90 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42  e.          ** B
13ba0 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77 69  ITMASK(nExpr) wi
13bb0 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e  thout overflowin
13bc0 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  g */.          t
13bd0 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e  estcase( pIdx->n
13be0 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b  Column==BMS-2 );
13bf0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
13c00 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ase( pIdx->nColu
13c10 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  mn==BMS-1 );.   
13c20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
13c30 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20  >nColumn>=BMS-1 
13c40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13c50 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42 65        if( mustBe
13c60 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20 20  Unique ){.      
13c70 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
13c80 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20  nKeyCol>nExpr.  
13c90 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49             ||(pI
13ca0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70  dx->nColumn>nExp
13cb0 72 20 26 26 20 21 49 73 55 6e 69 71 75 65 49 6e  r && !IsUniqueIn
13cc0 64 65 78 28 70 49 64 78 29 29 0a 20 20 20 20 20  dex(pIdx)).     
13cd0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
13ce0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
13cf0 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78  ;  /* This index
13d00 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f   is not unique o
13d10 76 65 72 20 74 68 65 20 49 4e 20 52 48 53 20 63  ver the IN RHS c
13d20 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
13d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13d40 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
13d50 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20 20   colUsed = 0;   
13d60 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e  /* Columns of in
13d70 64 65 78 20 75 73 65 64 20 73 6f 20 66 61 72 20  dex used so far 
13d80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
13d90 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
13da0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
13db0 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71   Expr *pLhs = sq
13dc0 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
13dd0 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66  Subexpr(pX->pLef
13de0 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
13df0 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20     Expr *pRhs = 
13e00 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
13e10 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
13e20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20  CollSeq *pReq = 
13e30 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
13e40 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
13e50 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29 3b  se, pLhs, pRhs);
13e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
13e70 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20   j;.  .         
13e80 20 20 20 61 73 73 65 72 74 28 20 70 52 65 71 21     assert( pReq!
13e90 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c  =0 || pRhs->iCol
13ea0 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c  umn==XN_ROWID ||
13eb0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b   pParse->nErr );
13ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
13ed0 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a  (j=0; j<nExpr; j
13ee0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
13ef0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
13f00 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e  olumn[j]!=pRhs->
13f10 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
13f20 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
13f30 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
13f40 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20  azColl[j] );.   
13f50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
13f60 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74 65  Req!=0 && sqlite
13f70 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a  3StrICmp(pReq->z
13f80 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  Name, pIdx->azCo
13f90 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20  ll[j])!=0 ){.   
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
13fb0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
13fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13fd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13ff0 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78        if( j==nEx
14000 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  pr ) break;.    
14010 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d          mCol = M
14020 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20 20  ASKBIT(j);.     
14030 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c 20         if( mCol 
14040 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65 61  & colUsed ) brea
14050 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d  k; /* Each colum
14060 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  n used only once
14070 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
14080 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b  colUsed |= mCol;
14090 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
140a0 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b 69   aiMap ) aiMap[i
140b0 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  ] = j;.         
140c0 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20   }.  .          
140d0 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70 72  assert( i==nExpr
140e0 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41   || colUsed!=(MA
140f0 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20  SKBIT(nExpr)-1) 
14100 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
14110 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42   colUsed==(MASKB
14120 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a  IT(nExpr)-1) ){.
14130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14140 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
14150 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e  point, that mean
14160 73 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78  s the index pIdx
14170 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20   is usable */.  
14180 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41            int iA
14190 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
141a0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
141b0 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
141c0 65 28 76 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  e(v);.#ifndef SQ
141d0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
141e0 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  N.            sq
141f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
14200 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30  v, OP_Explain, 0
14210 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
14220 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
14230 69 6e 74 66 28 64 62 2c 20 22 55 53 49 4e 47 20  intf(db, "USING 
14240 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d  INDEX %s FOR IN-
14250 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e  OPERATOR",pIdx->
14260 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
14270 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43        P4_DYNAMIC
14280 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
14290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
142a0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
142b0 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49  enRead, iTab, pI
142c0 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
142d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
142e0 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
142f0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
14300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
14310 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
14320 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
14330 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
14340 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58  assert( IN_INDEX
14350 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49  _INDEX_DESC == I
14360 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
14370 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  C+1 );.         
14380 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
14390 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20  DEX_INDEX_ASC + 
143a0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
143b0 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  [0];.  .        
143c0 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73      if( prRhsHas
143d0 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53  Null ){.#ifdef S
143e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
143f0 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20  UMN_USED_MASK.  
14400 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20              i64 
14410 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72  mask = (1<<nExpr
14420 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )-1;.           
14430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14440 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
14450 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20  olumnsUsed, .   
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
14470 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29  Tab, 0, 0, (u8*)
14480 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29  &mask, P4_INT64)
14490 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
144a0 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73         *prRhsHas
144b0 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
144c0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
144d0 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d       if( nExpr==
144e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
144f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48       sqlite3SetH
14500 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54  asNullFlag(v, iT
14510 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  ab, *prRhsHasNul
14520 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
14530 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
14540 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
14550 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14560 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
14570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14580 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f   } /* End loop o
14590 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  ver indexes */. 
145a0 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66       } /* End if
145b0 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20  ( affinity_ok ) 
145c0 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20  */.    } /* End 
145d0 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20  if not an rowid 
145e0 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20  index */.  } /* 
145f0 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  End attempt to o
14600 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e  ptimize using an
14610 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20   index */..  /* 
14620 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e  If no preexistin
14630 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c  g index is avail
14640 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20  able for the IN 
14650 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20  clause.  ** and 
14660 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
14670 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c   an allowed repl
14680 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52  y.  ** and the R
14690 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
146a0 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c  rator is a list,
146b0 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a   not a subquery.
146c0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53    ** and the RHS
146d0 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
146e0 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66   or has two or f
146f0 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a  ewer terms,.  **
14700 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
14710 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20 61  worth creating a
14720 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
14730 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20  e to evaluate.  
14740 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ** the IN operat
14750 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f  or so return IN_
14760 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f  INDEX_NOOP..  */
14770 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a  .  if( eType==0.
14780 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26     && (inFlags &
14790 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
147a0 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  K).   && !ExprHa
147b0 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
147c0 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26  _xIsSelect).   &
147d0 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73  & (!sqlite3InRhs
147e0 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c  IsConstant(pX) |
147f0 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pX->x.pList->n
14800 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20  Expr<=2).  ){.  
14810 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
14820 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20  EX_NOOP;.  }..  
14830 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a  if( eType==0 ){.
14840 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74      /* Could not
14850 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e   find an existin
14860 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
14870 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52   to use as the R
14880 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a  HS b-tree..    *
14890 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74  * We will have t
148a0 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70  o generate an ep
148b0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
148c0 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20   do the job..   
148d0 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65   */.    u32 save
148e0 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
148f0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
14900 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61  ;.    int rMayHa
14910 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  veNull = 0;.    
14920 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
14930 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e  _EPH;.    if( in
14940 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
14950 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70  _LOOP ){.      p
14960 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
14970 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  p = 0;.      if(
14980 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c   pX->pLeft->iCol
14990 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61  umn<0 && !ExprHa
149a0 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
149b0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
149c0 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
149d0 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20  N_INDEX_ROWID;. 
149e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
149f0 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
14a00 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68  l ){.      *prRh
14a10 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48  sHasNull = rMayH
14a20 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  aveNull = ++pPar
14a30 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a  se->nMem;.    }.
14a40 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
14a50 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
14a60 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c   pX, rMayHaveNul
14a70 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  l, eType==IN_IND
14a80 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70  EX_ROWID);.    p
14a90 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
14aa0 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c  p = savedNQueryL
14ab0 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oop;.  }else{.  
14ac0 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pX->iTable = i
14ad0 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  Tab;.  }..  if( 
14ae0 61 69 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d  aiMap && eType!=
14af0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
14b00 53 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f  SC && eType!=IN_
14b10 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
14b20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e   ){.    int i, n
14b30 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
14b40 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
14b50 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pX->pLeft);.    
14b60 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
14b70 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b  +) aiMap[i] = i;
14b80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54  .  }.  return eT
14b90 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ype;.}.#endif..#
14ba0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14bb0 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
14bc0 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72  * Argument pExpr
14bd0 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29   is an (?, ?...)
14be0 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   IN(...) express
14bf0 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ion. This .** fu
14c00 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
14c10 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e   and returns a n
14c20 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
14c30 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
14c40 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69  .** the affiniti
14c50 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  es to be used fo
14c60 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
14c70 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
14c80 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  .**.** It is the
14c90 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
14ca0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
14cb0 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
14cc0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72   returned.** str
14cd0 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ing is eventuall
14ce0 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71  y freed using sq
14cf0 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a  lite3DbFree()..*
14d00 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65  /.static char *e
14d10 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61  xprINAffinity(Pa
14d20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
14d30 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
14d40 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
14d50 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e  ->pLeft;.  int n
14d60 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Val = sqlite3Exp
14d70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66  rVectorSize(pLef
14d80 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  t);.  Select *pS
14d90 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e  elect = (pExpr->
14da0 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
14db0 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78  lect) ? pExpr->x
14dc0 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20  .pSelect : 0;.  
14dd0 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61  char *zRet;..  a
14de0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
14df0 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65  ==TK_IN );.  zRe
14e00 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
14e10 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64  locRaw(pParse->d
14e20 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66  b, nVal+1);.  if
14e30 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e  ( zRet ){.    in
14e40 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
14e50 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
14e60 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d        Expr *pA =
14e70 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
14e80 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
14e90 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72  , i);.      char
14ea0 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   a = sqlite3Expr
14eb0 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20  Affinity(pA);.  
14ec0 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
14ed0 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b  ){.        zRet[
14ee0 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  i] = sqlite3Comp
14ef0 61 72 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c  areAffinity(pSel
14f00 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  ect->pEList->a[i
14f10 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20  ].pExpr, a);.   
14f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14f30 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20    zRet[i] = a;. 
14f40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14f50 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c   zRet[nVal] = '\
14f60 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0';.  }.  return
14f70 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a   zRet;.}.#endif.
14f80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f90 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
14fa0 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72  .** Load the Par
14fb0 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  se object passed
14fc0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
14fd0 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65  gument with an e
14fe0 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65  rror .** message
14ff0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
15000 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63  .**   "sub-selec
15010 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75  t returns N colu
15020 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d  mns - expected M
15030 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c  ".*/   .void sql
15040 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
15050 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
15060 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69  , int nActual, i
15070 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63  nt nExpect){.  c
15080 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20  onst char *zFmt 
15090 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65  = "sub-select re
150a0 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73  turns %d columns
150b0 20 2d 20 65 78 70 65 63 74 65 64 20 25 64 22 3b   - expected %d";
150c0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
150d0 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c  sg(pParse, zFmt,
150e0 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63   nActual, nExpec
150f0 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
15100 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
15110 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72  Expr is a vector
15120 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 75   that has been u
15130 73 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74  sed in a context
15140 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20   where.** it is 
15150 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49  not permitted. I
15160 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62  f pExpr is a sub
15170 2d 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20  -select vector, 
15180 74 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a  this routine .**
15190 20 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73 65   loads the Parse
151a0 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d   object with a m
151b0 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f  essage of the fo
151c0 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62  rm:.**.**   "sub
151d0 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
151e0 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65  N columns - expe
151f0 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72  cted 1".**.** Or
15200 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 67  , if it is a reg
15210 75 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63 74  ular scalar vect
15220 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77  or:.**.**   "row
15230 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a   value misused".
15240 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74  */   .void sqlit
15250 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67  e3VectorErrorMsg
15260 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15270 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69  Expr *pExpr){.#i
15280 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15290 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
152a0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
152b0 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a  EP_xIsSelect ){.
152c0 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65      sqlite3Subse
152d0 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
152e0 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
152f0 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
15300 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  r, 1);.  }else.#
15310 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
15320 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15330 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65  arse, "row value
15340 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a   misused");.  }.
15350 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15360 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
15370 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
15380 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
15390 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53  expression, EXIS
153a0 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65  TS,.** or IN ope
153b0 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
153c0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
153d0 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
153e0 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
153f0 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
15400 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
15410 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
15420 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
15430 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
15440 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
15450 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
15460 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
15470 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
15480 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
15490 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
154a0 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
154b0 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
154c0 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
154d0 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
154e0 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
154f0 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
15500 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
15510 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
15520 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ry..**.** If par
15530 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69  ameter isRowid i
15540 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
15550 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
15560 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  r is guaranteed.
15570 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20  ** to be of the 
15580 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e  form "<rowid> IN
15590 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65   (?, ?, ?)", whe
155a0 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20  re <rowid> is a 
155b0 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20  reference.** to 
155c0 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79  some integer key
155d0 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
155e0 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  le B-Tree. In th
155f0 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a  is case, use an.
15600 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  ** intkey B-Tree
15610 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
15620 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c  t of IN(...) val
15630 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74  ues instead of t
15640 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f  he usual.** (slo
15650 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65  wer) variable le
15660 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65  ngth keys B-Tree
15670 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
15680 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  aveNull is non-z
15690 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
156a0 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69  that the operati
156b0 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28  on is an IN.** (
156c0 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20  not a SELECT or 
156d0 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74  EXISTS) and that
156e0 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63   the RHS might c
156f0 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a  ontains NULLs..*
15700 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69  * All this routi
15710 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69  ne does is initi
15720 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74  alize the regist
15730 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79  er given by rMay
15740 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e  HaveNull.** to N
15750 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f  ULL.  Calling ro
15760 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65  utines will take
15770 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e   care of changin
15780 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a  g this register.
15790 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d  ** value to non-
157a0 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20  NULL if the RHS 
157b0 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a  is NULL-free..**
157c0 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54  .** For a SELECT
157d0 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
157e0 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20  tor, return the 
157f0 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
15800 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  lds the.** resul
15810 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d  t.  For a multi-
15820 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74  column SELECT, t
15830 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
15840 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75  red in a contigu
15850 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20  ous.** array of 
15860 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
15870 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
15880 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6f  s the register o
15890 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a  f the left-most.
158a0 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
158b0 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20  .  Return 0 for 
158c0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20  IN operators or 
158d0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
158e0 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  rs..*/.#ifndef S
158f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
15900 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ERY.int sqlite3C
15910 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20  odeSubselect(.  
15920 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15930 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
15940 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
15950 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
15960 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
15970 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58  N, SELECT, or EX
15980 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ISTS operator */
15990 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46  .  int rHasNullF
159a0 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65  lag,       /* Re
159b0 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f  gister that reco
159c0 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c  rds whether NULL
159d0 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a  s exist in RHS *
159e0 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20  /.  int isRowid 
159f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15a00 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49  f true, LHS of I
15a10 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
15a20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rowid */.){.  in
15a30 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d  t jmpIfDynamic =
15a40 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
15a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
15a60 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
15a70 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67  ss */.  int rReg
15a80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
15a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15aa0 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
15ab0 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
15ac0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
15ad0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
15ae0 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  se);.  if( NEVER
15af0 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  (v==0) ) return 
15b00 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
15b10 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
15b20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61  );..  /* The eva
15b30 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  luation of the I
15b40 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20  N/EXISTS/SELECT 
15b50 6d 75 73 74 20 62 65 20 72 65 70 65 61 74 65 64  must be repeated
15b60 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20   every time it. 
15b70 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
15b80 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ed if any of the
15b90 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
15ba0 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
15bb0 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
15bc0 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
15bd0 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
15be0 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
15bf0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
15c00 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
15c10 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
15c20 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
15c30 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
15c40 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
15c50 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
15c60 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
15c70 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
15c80 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
15c90 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
15ca0 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
15cb0 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
15cc0 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
15cd0 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
15ce0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
15cf0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
15d00 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
15d10 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a  Select) ){.    j
15d20 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71  mpIfDynamic = sq
15d30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
15d40 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
15d50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15d60 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15d70 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
15d80 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
15d90 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
15da0 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
15db0 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
15dc0 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20  e->db, "EXECUTE 
15dd0 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64  %s%s SUBQUERY %d
15de0 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70 49 66  ",.        jmpIf
15df0 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43  Dynamic>=0?"":"C
15e00 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20  ORRELATED ",.   
15e10 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
15e20 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43  TK_IN?"LIST":"SC
15e30 41 4c 41 52 22 2c 0a 20 20 20 20 20 20 20 20 70  ALAR",.        p
15e40 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
15e50 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  ctId.    );.    
15e60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15e70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
15e80 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
15e90 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
15ea0 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
15eb0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63  .#endif..  switc
15ec0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
15ed0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
15ee0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
15ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15f00 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
15f10 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  f OP_OpenEphemer
15f20 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
15f30 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
15f40 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
15f50 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f  ft; /* the LHS o
15f60 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
15f70 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e  r */.      KeyIn
15f80 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30  fo *pKeyInfo = 0
15f90 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e  ;      /* Key in
15fa0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
15fb0 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20     int nVal;    
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15fd0 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72  * Size of vector
15fe0 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20   pLeft */.      
15ff0 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d 20 73 71  .      nVal = sq
16000 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
16010 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ize(pLeft);.    
16020 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77    assert( !isRow
16030 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b  id || nVal==1 );
16040 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  ..      /* Wheth
16050 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78  er this is an 'x
16060 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20   IN(SELECT...)' 
16070 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70  or an 'x IN(<exp
16080 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a  rlist>)'.      *
16090 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20  * expression it 
160a0 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73  is handled the s
160b0 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68  ame way.  An eph
160c0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  emeral table is 
160d0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
160e0 20 77 69 74 68 20 69 6e 64 65 78 20 6b 65 79 73   with index keys
160f0 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
16100 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74  e results from t
16110 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  he .      ** SEL
16120 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72  ECT or the <expr
16130 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a  list>..      **.
16140 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
16150 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69  'x' expression i
16160 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
16170 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e  , or the SELECT.
16180 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  ...      ** stat
16190 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20  ement returns a 
161a0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68  column value, th
161b0 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  en the affinity 
161c0 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  of that.      **
161d0 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
161e0 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64  to build the ind
161f0 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68  ex keys. If both
16200 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20   'x' and the.   
16210 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20     ** SELECT... 
16220 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
16230 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
16240 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20  ric affinity is 
16250 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66  used.      ** if
16260 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68   either column h
16270 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e  as NUMERIC or IN
16280 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20  TEGER affinity. 
16290 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20  If neither.     
162a0 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20   ** 'x' nor the 
162b0 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
162c0 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
162d0 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
162e0 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20  finity.      ** 
162f0 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  is used..      *
16300 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  /.      pExpr->i
16310 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
16320 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64  nTab++;.      ad
16330 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
16340 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
16350 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20  nEphemeral, .   
16360 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
16370 61 62 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f 30  able, (isRowid?0
16380 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20 20 70  :nVal));.      p
16390 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69  KeyInfo = isRowi
163a0 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b  d ? 0 : sqlite3K
163b0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
163c0 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29  se->db, nVal, 1)
163d0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  ;..      if( Exp
163e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
163f0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
16400 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16410 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72  Case 1:     expr
16420 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
16430 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
16440 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20      ** Generate 
16450 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68  code to write th
16460 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
16470 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65   select into the
16480 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
16490 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f     ** table allo
164a0 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  cated and opened
164b0 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
164c0 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  */.        Selec
164d0 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78  t *pSelect = pEx
164e0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
164f0 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
16500 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  *pEList = pSelec
16510 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t->pEList;..    
16520 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
16530 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
16540 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61 6e  /* If the LHS an
16550 64 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  d RHS of the IN 
16560 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20  operator do not 
16570 6d 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20 20  match, that.    
16580 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c      ** error wil
16590 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61 75 67  l have been caug
165a0 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77  ht long before w
165b0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
165c0 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nt. */.        i
165d0 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74  f( ALWAYS(pEList
165e0 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29  ->nExpr==nVal) )
165f0 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
16600 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
16610 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
16620 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
16630 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
16640 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
16650 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
16660 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66          dest.zAf
16670 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66  fSdst = exprINAf
16680 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
16690 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
166a0 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
166b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
166c0 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63  testcase( pSelec
166d0 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
166e0 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
166f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16700 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20   pKeyInfo==0 ); 
16710 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d  /* Caused by OOM
16720 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e   in sqlite3KeyIn
16730 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20  foAlloc() */.   
16740 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
16750 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
16760 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
16770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16780 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
16790 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
167a0 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
167b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
167c0 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
167d0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fo);.           
167e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
167f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16800 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
16810 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e  Parse->db, dest.
16820 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  zAffSdst);.     
16830 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
16840 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f  yInfo!=0 ); /* O
16850 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78  OM will cause ex
16860 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33  it after sqlite3
16870 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20  Select() */.    
16880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
16890 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  List!=0 );.     
168a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
168b0 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
168c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
168d0 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
168e0 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
168f0 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
16900 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
16910 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
16920 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
16930 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
16940 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
16950 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
16960 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
16970 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [i] = sqlite3Bin
16980 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
16990 71 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q(.             
169a0 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45     pParse, p, pE
169b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
169c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
169d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
169e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
169f0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
16a00 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20  pr->x.pList!=0) 
16a10 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
16a20 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
16a30 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
16a40 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
16a50 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
16a60 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
16a70 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
16a80 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
16a90 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
16aa0 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
16ab0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
16ac0 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
16ad0 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
16ae0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
16af0 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
16b00 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
16b10 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
16b20 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
16b30 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
16b40 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
16b50 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
16b60 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66  .        char af
16b70 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20  finity;         
16b80 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f     /* Affinity o
16b90 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  f the LHS of the
16ba0 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69   IN */.        i
16bb0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
16bc0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
16bd0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
16be0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
16bf0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
16c00 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  tem;.        int
16c10 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20   r1, r2, r3;..  
16c20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
16c30 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
16c40 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20  nity(pLeft);.   
16c50 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69       if( !affini
16c60 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
16c70 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
16c80 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
16c90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
16ca0 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
16cb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16cc0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
16cd0 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
16ce0 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fo) );.         
16cf0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
16d00 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  [0] = sqlite3Exp
16d10 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
16d20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
16d30 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
16d40 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
16d50 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
16d60 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
16d70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20  . */.        r1 
16d80 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
16d90 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
16da0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
16db0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16dc0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
16dd0 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74   isRowid ) sqlit
16de0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16df0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b  OP_Null, 0, r2);
16e00 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
16e10 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
16e20 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
16e30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
16e40 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
16e50 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
16e60 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
16e70 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20  nt iValToIns;.. 
16e80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
16e90 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
16ea0 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
16eb0 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
16ec0 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
16ed0 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
16ee0 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
16ef0 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
16f00 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
16f10 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
16f20 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
16f30 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
16f40 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
16f50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
16f60 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
16f70 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
16f80 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
16f90 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
16fa0 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44        if( jmpIfD
16fb0 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71  ynamic>=0 && !sq
16fc0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
16fd0 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
16fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16ff0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
17000 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29  v, jmpIfDynamic)
17010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ;.            jm
17020 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b  pIfDynamic = -1;
17030 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
17040 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
17050 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
17060 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
17070 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
17080 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
17090 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26    if( isRowid &&
170a0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
170b0 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c  teger(pE2, &iVal
170c0 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20  ToIns) ){.      
170d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
170e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
170f0 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e  sertInt, pExpr->
17100 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c  iTable, r2, iVal
17110 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  ToIns);.        
17120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17130 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
17140 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
17150 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
17160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
17170 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
17180 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17190 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
171a0 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33  OP_MustBeInt, r3
171b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
171e0 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
17200 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
17220 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17230 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78  , OP_Insert, pEx
17240 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
17250 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r3);.           
17260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17270 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17280 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
17290 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c  keRecord, r3, 1,
172a0 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
172b0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
172c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
172d0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
172e0 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b  (pParse, r3, 1);
172f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
17300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17310 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
17320 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
17330 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a  le, r2, r3, 1);.
17340 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
17350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17360 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
17370 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17380 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
17390 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
173a0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
173b0 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
173c0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  }.      if( pKey
173d0 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
173e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
173f0 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
17400 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  id *)pKeyInfo, P
17410 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
17420 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
17430 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
17440 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
17450 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
17460 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
17470 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20       /* Case 3: 
17480 20 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46     (SELECT ... F
17490 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a  ROM ...).      *
174a0 2a 20 20 20 20 20 6f 72 3a 20 20 20 20 45 58 49  *     or:    EXI
174b0 53 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  STS(SELECT ... F
174c0 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a  ROM ...).      *
174d0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
174e0 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74   SELECT, generat
174f0 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
17500 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c  e values for all
17510 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20   columns of.    
17520 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
17530 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ow into an array
17540 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e   of registers an
17550 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64  d return the ind
17560 65 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ex of.      ** t
17570 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
17580 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
17590 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
175a0 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
175b0 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e   an integer 0 (n
175c0 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20  ot exists) or 1 
175d0 28 65 78 69 73 74 73 29 0a 20 20 20 20 20 20 2a  (exists).      *
175e0 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
175f0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  r and return tha
17600 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
17610 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
17620 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73    ** In both cas
17630 65 73 2c 20 74 68 65 20 71 75 65 72 79 20 69 73  es, the query is
17640 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
17650 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79 20  "LIMIT 1".  Any 
17660 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 65 78 69  .      ** preexi
17670 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 64  sting limit is d
17680 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61 63  iscarded in plac
17690 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49 4d  e of the new LIM
176a0 49 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  IT 1..      */. 
176b0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
176c0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
176d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
176e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
176f0 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20  o encode */.    
17700 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
17710 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
17720 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
17730 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
17740 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  CT result */.   
17750 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20     int nReg;    
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17770 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
17780 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
17790 65 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  e */..      test
177a0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
177b0 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
177c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
177d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
177e0 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
177f0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
17800 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
17810 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
17820 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17830 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
17840 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
17850 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20 20  elect) );..     
17860 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
17870 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
17880 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70  nReg = pExpr->op
17890 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53  ==TK_SELECT ? pS
178a0 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  el->pEList->nExp
178b0 72 20 3a 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  r : 1;.      sql
178c0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
178d0 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61  it(&dest, 0, pPa
178e0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20  rse->nMem+1);.  
178f0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
17900 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20   += nReg;.      
17910 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
17920 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
17930 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
17940 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
17950 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64    dest.iSdst = d
17960 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
17970 20 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20       dest.nSdst 
17980 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 20 20  = nReg;.        
17990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
179a0 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
179b0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64   dest.iSDParm, d
179c0 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67  est.iSDParm+nReg
179d0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
179e0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
179f0 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75  it subquery resu
17a00 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lt"));.      }el
17a10 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74  se{.        dest
17a20 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69  .eDest = SRT_Exi
17a30 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
17a40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17a50 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
17a60 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
17a70 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
17a80 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58  ent((v, "Init EX
17a90 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a  ISTS result"));.
17aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
17ab0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
17ac0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c  pParse->db, pSel
17ad0 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
17ae0 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSel->pLimit = 
17af0 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
17b00 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
17b10 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 20  INTEGER,.       
17b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b30 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69             &sqli
17b40 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c  te3IntTokens[1],
17b50 20 30 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d   0);.      pSel-
17b60 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
17b70 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67     pSel->selFlag
17b80 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61  s &= ~SF_MultiVa
17b90 6c 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  lue;.      if( s
17ba0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
17bb0 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74  rse, pSel, &dest
17bc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
17bd0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
17be0 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74       rReg = dest
17bf0 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
17c00 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
17c10 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
17c20 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72  educe);.      br
17c30 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
17c40 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c    if( rHasNullFl
17c50 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ag ){.    sqlite
17c60 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
17c70 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  v, pExpr->iTable
17c80 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b  , rHasNullFlag);
17c90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49  .  }..  if( jmpI
17ca0 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20  fDynamic>=0 ){. 
17cb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
17cc0 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44  mpHere(v, jmpIfD
17cd0 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73  ynamic);.  }.  s
17ce0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
17cf0 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72  op(pParse);..  r
17d00 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65  eturn rReg;.}.#e
17d10 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
17d20 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
17d30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d40 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
17d50 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20  .** Expr pIn is 
17d60 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65  an IN(...) expre
17d70 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63  ssion. This func
17d80 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74  tion checks that
17d90 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c   the .** sub-sel
17da0 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ect on the RHS o
17db0 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61  f the IN() opera
17dc0 74 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d 65  tor has the same
17dd0 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63   number of .** c
17de0 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65  olumns as the ve
17df0 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e  ctor on the LHS.
17e00 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53 20   Or, if the RHS 
17e10 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e  of the IN() is n
17e20 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65  ot .** a sub-que
17e30 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53  ry, that the LHS
17e40 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20   is a vector of 
17e50 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73  size 1..*/.int s
17e60 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49  qlite3ExprCheckI
17e70 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  N(Parse *pParse,
17e80 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69   Expr *pIn){.  i
17e90 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c  nt nVector = sql
17ea0 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
17eb0 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  ze(pIn->pLeft);.
17ec0 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67    if( (pIn->flag
17ed0 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
17ee0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65  ) ){.    if( nVe
17ef0 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65  ctor!=pIn->x.pSe
17f00 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
17f10 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
17f20 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
17f30 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  or(pParse, pIn->
17f40 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
17f50 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f  t->nExpr, nVecto
17f60 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
17f70 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
17f80 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31  e if( nVector!=1
17f90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
17fa0 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50  ectorErrorMsg(pP
17fb0 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74  arse, pIn->pLeft
17fc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
17fd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
17fe0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
17ff0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
18000 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
18010 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
18020 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  an IN expression
18030 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  ..**.**      x I
18040 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  N (SELECT ...).*
18050 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c  *      x IN (val
18060 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a  ue, value, ...).
18070 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68  **.** The left-h
18080 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69  and side (LHS) i
18090 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65  s a scalar or ve
180a0 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  ctor expression.
180b0 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d    The .** right-
180c0 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20  hand side (RHS) 
180d0 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a  is an array of z
180e0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c  ero or more scal
180f0 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a  ar values, or a.
18100 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49 66  ** subquery.  If
18110 20 74 68 65 20 52 48 53 20 69 73 20 61 20 73 75   the RHS is a su
18120 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62  bquery, the numb
18130 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
18140 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74  umns must.** mat
18150 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
18160 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
18170 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48  vector on the LH
18180 53 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  S.  If the RHS i
18190 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76  s.** a list of v
181a0 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d  alues, the LHS m
181b0 75 73 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e  ust be a scalar.
181c0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f   .**.** The IN o
181d0 70 65 72 61 74 6f 72 20 69 73 20 74 72 75 65 20  perator is true 
181e0 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65  if the LHS value
181f0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69   is contained wi
18200 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a  thin the RHS..**
18210 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 66   The result is f
18220 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20  alse if the LHS 
18230 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f  is definitely no
18240 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54  t in the RHS.  T
18250 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  he .** result is
18260 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65   NULL if the pre
18270 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53  sence of the LHS
18280 20 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e   in the RHS cann
18290 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d  ot be .** determ
182a0 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c  ined due to NULL
182b0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
182c0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
182d0 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20  code that jumps 
182e0 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69  to destIfFalse i
182f0 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
18300 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77   .** contained w
18310 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
18320 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  If due to NULLs 
18330 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
18340 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a  ine if the LHS.*
18350 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  * is contained i
18360 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a  n the RHS then j
18370 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c  ump to destIfNul
18380 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  l.  If the LHS i
18390 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77  s contained.** w
183a0 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68  ithin the RHS th
183b0 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  en fall through.
183c0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73  .**.** See the s
183d0 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61  eparate in-opera
183e0 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61  tor.md documenta
183f0 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65  tion file in the
18400 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51   canonical.** SQ
18410 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72 65 65  Lite source tree
18420 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
18430 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
18440 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
18450 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20  te3ExprCodeIN(. 
18460 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
18470 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
18480 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
18490 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
184a0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
184b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
184c0 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  IN expression */
184d0 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c  .  int destIfFal
184e0 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  se,      /* Jump
184f0 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20   here if LHS is 
18500 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
18510 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
18520 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20  t destIfNull    
18530 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
18540 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   if the results 
18550 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20  are unknown due 
18560 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20  to NULLs */.){. 
18570 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c   int rRhsHasNull
18580 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74   = 0;  /* Regist
18590 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20  er that is true 
185a0 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  if RHS contains 
185b0 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20  NULL values */. 
185c0 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20   int eType;     
185d0 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
185e0 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  f the RHS */.  i
185f0 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20  nt rLhs;        
18600 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
18610 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  (s) holding the 
18620 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  LHS values */.  
18630 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20  int rLhsOrig;   
18640 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c        /* LHS val
18650 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f  ues prior to reo
18660 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70  rdering by aiMap
18670 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  [] */.  Vdbe *v;
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18690 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   Statement under
186a0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
186b0 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20  .  int *aiMap = 
186c0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20  0;       /* Map 
186d0 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c  from vector fiel
186e0 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d  d to index colum
186f0 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66  n */.  char *zAf
18700 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  f = 0;       /* 
18710 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  Affinity string 
18720 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20  for comparisons 
18730 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72  */.  int nVector
18740 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
18750 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f  ze of vectors fo
18760 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74  r this IN operat
18770 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d  or */.  int iDum
18780 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  my;           /*
18790 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72   Dummy parameter
187a0 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74   to exprCodeVect
187b0 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a  or() */.  Expr *
187c0 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
187d0 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68  /* The LHS of th
187e0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
187f0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
18800 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70           /* loop
18810 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
18820 74 20 64 65 73 74 53 74 65 70 32 3b 20 20 20 20  t destStep2;    
18830 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
18840 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20  jump when NULLs 
18850 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a  seen in step 2 *
18860 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70  /.  int destStep
18870 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61  6 = 0;    /* Sta
18880 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53  rt of code for S
18890 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61  tep 6 */.  int a
188a0 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20  ddrTruthOp;     
188b0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f   /* Address of o
188c0 70 63 6f 64 65 20 74 68 61 74 20 64 65 74 65 72  pcode that deter
188d0 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20  mines the IN is 
188e0 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  true */.  int de
188f0 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20  stNotNull;      
18900 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
18910 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  a comparison is 
18920 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65 70  not true in step
18930 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
18940 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Top;          /*
18950 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70   Top of the step
18960 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70  -6 loop */ ..  p
18970 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
18980 65 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  eft;.  if( sqlit
18990 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50  e3ExprCheckIN(pP
189a0 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72  arse, pExpr) ) r
189b0 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20  eturn;.  zAff = 
189c0 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70  exprINAffinity(p
189d0 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
189e0 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nVector = sqlit
189f0 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
18a00 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
18a10 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29    aiMap = (int*)
18a20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
18a30 65 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73  ero(.      pPars
18a40 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28  e->db, nVector*(
18a50 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69  sizeof(int) + si
18a60 7a 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a  zeof(char)) + 1.
18a70 20 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73    );.  if( pPars
18a80 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
18a90 6c 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74  led ) goto sqlit
18aa0 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d  e3ExprCodeIN_oom
18ab0 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74  _error;..  /* At
18ac0 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65  tempt to compute
18ad0 20 74 68 65 20 52 48 53 2e 20 41 66 74 65 72 20   the RHS. After 
18ae0 74 68 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e  this step, if an
18af0 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
18b00 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  n.  ** IN_INDEX_
18b10 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64  NOOP is returned
18b20 2c 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e  , the table open
18b30 65 64 20 69 74 68 20 63 75 72 73 6f 72 20 70 45  ed ith cursor pE
18b40 78 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a  xpr->iTable .  *
18b50 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  * contains the v
18b60 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
18b70 75 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49  up the RHS. If I
18b80 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
18b90 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74  returned,.  ** t
18ba0 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79  he RHS has not y
18bb0 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20  et been coded.  
18bc0 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
18bd0 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
18be0 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
18bf0 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20  /* OOM detected 
18c00 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f  prior to this ro
18c10 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e  utine */.  VdbeN
18c20 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
18c30 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29  begin IN expr"))
18c40 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69  ;.  eType = sqli
18c50 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
18c60 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20  Parse, pExpr,.  
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c80 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e             IN_IN
18c90 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c  DEX_MEMBERSHIP |
18ca0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
18cb0 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cd0 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
18ce0 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72  tIfNull ? 0 : &r
18cf0 52 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61  RhsHasNull, aiMa
18d00 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  p);..  assert( p
18d10 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e  Parse->nErr || n
18d20 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79  Vector==1 || eTy
18d30 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48  pe==IN_INDEX_EPH
18d40 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
18d50 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
18d60 5f 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49  _ASC || eType==I
18d70 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
18d80 53 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66 20  SC .  );.#ifdef 
18d90 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
18da0 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20 61  * Confirm that a
18db0 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  iMap[] contains 
18dc0 6e 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72 20  nVector integer 
18dd0 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30  values between 0
18de0 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f   and.  ** nVecto
18df0 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  r-1. */.  for(i=
18e00 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
18e10 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63  +){.    int j, c
18e20 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d  nt;.    for(cnt=
18e30 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20  j=0; j<nVector; 
18e40 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b 6a  j++) if( aiMap[j
18e50 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20  ]==i ) cnt++;.  
18e60 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 31    assert( cnt==1
18e70 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
18e80 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48    /* Code the LH
18e90 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72  S, the <expr> fr
18ea0 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e  om "<expr> IN (.
18eb0 2e 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53  ..)". If the LHS
18ec0 20 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74   is a .  ** vect
18ed0 6f 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73  or, then it is s
18ee0 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61  tored in an arra
18ef0 79 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67  y of nVector reg
18f00 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
18f10 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a  .  ** at r1..  *
18f20 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69  *.  ** sqlite3Fi
18f30 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67 68  ndInIndex() migh
18f40 74 20 68 61 76 65 20 72 65 6f 72 64 65 72 65 64  t have reordered
18f50 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74   the fields of t
18f60 68 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20 20  he LHS vector.  
18f70 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  ** so that the f
18f80 69 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68 65  ields are in the
18f90 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 61   same order as a
18fa0 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  n existing index
18fb0 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d  .   The.  ** aiM
18fc0 61 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ap[] array conta
18fd0 69 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66 72  ins a mapping fr
18fe0 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  om the original 
18ff0 4c 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72 20  LHS field order 
19000 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65 6c  to.  ** the fiel
19010 64 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61 74  d order that mat
19020 63 68 65 73 20 74 68 65 20 52 48 53 20 69 6e 64  ches the RHS ind
19030 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
19040 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
19050 70 50 61 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f  pParse);.  rLhsO
19060 72 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56 65  rig = exprCodeVe
19070 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c 65  ctor(pParse, pLe
19080 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20  ft, &iDummy);.  
19090 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
190a0 6f 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d  or && aiMap[i]==
190b0 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65  i; i++){} /* Are
190c0 20 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f 72   LHS fields reor
190d0 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20  dered? */.  if( 
190e0 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20  i==nVector ){.  
190f0 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73 20    /* LHS fields 
19100 61 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65  are not reordere
19110 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20  d */.    rLhs = 
19120 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73  rLhsOrig;.  }els
19130 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  e{.    /* Need t
19140 6f 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c 48  o reorder the LH
19150 53 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64 69  S fields accordi
19160 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20  ng to aiMap */. 
19170 20 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74 65     rLhs = sqlite
19180 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
19190 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a  arse, nVector);.
191a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
191b0 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
191c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
191d0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
191e0 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c  , rLhsOrig+i, rL
191f0 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b  hs+aiMap[i], 0);
19200 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19210 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49   If sqlite3FindI
19220 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74  nIndex() did not
19230 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
19240 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
19250 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  .  ** suitable f
19260 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  or evaluating th
19270 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74  e IN operator, t
19280 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69  hen evaluate usi
19290 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e  ng a.  ** sequen
192a0 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
192b0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
192c0 73 20 69 73 20 73 74 65 70 20 28 31 29 20 69 6e  s is step (1) in
192d0 20 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72   the in-operator
192e0 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c  .md optimized al
192f0 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20  gorithm..  */.  
19300 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
19310 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20  DEX_NOOP ){.    
19320 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
19330 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
19340 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
19350 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
19360 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
19370 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
19380 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b  .    int labelOk
19390 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
193a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
193b0 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65  int r2, regToFre
193c0 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b  e;.    int regCk
193d0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Null = 0;.    in
193e0 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74  t ii;.    assert
193f0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
19400 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
19410 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69  Select) );.    i
19420 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64  f( destIfNull!=d
19430 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
19440 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20      regCkNull = 
19450 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
19460 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
19470 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19480 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c  p3(v, OP_BitAnd,
19490 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67   rLhs, rLhs, reg
194a0 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  CkNull);.    }. 
194b0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
194c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69  pList->nExpr; ii
194d0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20  ++){.      r2 = 
194e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
194f0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73  emp(pParse, pLis
19500 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20  t->a[ii].pExpr, 
19510 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20  &regToFree);.   
19520 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c     if( regCkNull
19530 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
19540 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e  anBeNull(pList->
19550 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  a[ii].pExpr) ){.
19560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19570 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19580 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c  BitAnd, regCkNul
19590 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c  l, r2, regCkNull
195a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
195b0 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e   if( ii<pList->n
195c0 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66  Expr-1 || destIf
195d0 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73  Null!=destIfFals
195e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
195f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
19600 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c  , OP_Eq, rLhs, l
19610 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20  abelOk, r2,.    
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19630 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
19640 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
19650 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
19660 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c  erageIf(v, ii<pL
19670 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
19680 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
19690 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69  ageIf(v, ii==pLi
196a0 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
196b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
196c0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66  eChangeP5(v, zAf
196d0 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  f[0]);.      }el
196e0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
196f0 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  rt( destIfNull==
19700 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20  destIfFalse );. 
19710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19720 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e  beAddOp4(v, OP_N
19730 65 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46  e, rLhs, destIfF
19740 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20  alse, r2,.      
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19760 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
19770 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56  , P4_COLLSEQ); V
19780 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
197a0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a  dbeChangeP5(v, z
197b0 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f  Aff[0] | SQLITE_
197c0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
197d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
197e0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
197f0 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72  (pParse, regToFr
19800 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ee);.    }.    i
19810 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a  f( regCkNull ){.
19820 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19830 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
19840 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c  Null, regCkNull,
19850 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64   destIfNull); Vd
19860 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19870 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19880 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
19890 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lse);.    }.    
198a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
198b0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
198c0 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Ok);.    sqlite3
198d0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
198e0 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c  Parse, regCkNull
198f0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69  );.    goto sqli
19900 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69  te3ExprCodeIN_fi
19910 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f  nished;.  }..  /
19920 2a 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20  * Step 2: Check 
19930 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48  to see if the LH
19940 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  S contains any N
19950 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66  ULL columns.  If
19960 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f   the.  ** LHS do
19970 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73  es contain NULLs
19980 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
19990 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
199a0 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20  FALSE or NULL.. 
199b0 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e   ** We will then
199c0 20 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79   skip the binary
199d0 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52   search of the R
199e0 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  HS..  */.  if( d
199f0 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
19a00 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65  fFalse ){.    de
19a10 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66  stStep2 = destIf
19a20 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  False;.  }else{.
19a30 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20      destStep2 = 
19a40 64 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69  destStep6 = sqli
19a50 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
19a60 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (v);.  }.  for(i
19a70 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
19a80 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
19a90 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
19aa0 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78  FieldSubexpr(pEx
19ab0 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pr->pLeft, i);. 
19ac0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
19ad0 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29  prCanBeNull(p) )
19ae0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
19af0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19b00 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20  IsNull, rLhs+i, 
19b10 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20  destStep2);.    
19b20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
19b30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
19b40 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65 20  /* Step 3.  The 
19b50 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e  LHS is now known
19b60 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e   to be non-NULL.
19b70 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20    Do the binary 
19b80 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74  search.  ** of t
19b90 68 65 20 52 48 53 20 75 73 69 6e 67 20 74 68 65  he RHS using the
19ba0 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e   LHS as a probe.
19bb0 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20    If found, the 
19bc0 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74  result is.  ** t
19bd0 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rue..  */.  if( 
19be0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
19bf0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20  ROWID ){.    /* 
19c00 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
19c10 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57  e RHS is the ROW
19c20 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72  ID of table b-tr
19c30 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73  ee and so we als
19c40 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68  o.    ** know th
19c50 61 74 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f  at the RHS is no
19c60 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20  n-NULL.  Hence, 
19c70 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73  we combine steps
19c80 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20   3 and 4.    ** 
19c90 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70  into a single op
19ca0 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  code. */.    sql
19cb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19cc0 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20  , OP_SeekRowid, 
19cd0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
19ce0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73  estIfFalse, rLhs
19cf0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
19d00 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
19d10 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65  TruthOp = sqlite
19d20 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
19d30 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74  P_Goto);  /* Ret
19d40 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65  urn True */.  }e
19d50 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
19d60 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19d70 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c  _Affinity, rLhs,
19d80 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66   nVector, 0, zAf
19d90 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  f, nVector);.   
19da0 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65   if( destIfFalse
19db0 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a  ==destIfNull ){.
19dc0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
19dd0 20 53 74 65 70 20 33 20 61 6e 64 20 53 74 65 70   Step 3 and Step
19de0 20 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65   5 into a single
19df0 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   opcode */.     
19e00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19e10 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
19e20 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
19e30 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
19e40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68               rLh
19e60 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62  s, nVector); Vdb
19e70 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19e80 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33      goto sqlite3
19e90 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
19ea0 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  hed;.    }.    /
19eb0 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20  * Ordinary Step 
19ec0 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  3, for the case 
19ed0 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20  where FALSE and 
19ee0 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63  NULL are distinc
19ef0 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75  t */.    addrTru
19f00 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  thOp = sqlite3Vd
19f10 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
19f20 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
19f30 69 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20  iTable, 0,.     
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f60 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b   rLhs, nVector);
19f70 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19f80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  ;.  }..  /* Step
19f90 20 34 2e 20 20 49 66 20 74 68 65 20 52 48 53 20   4.  If the RHS 
19fa0 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e  is known to be n
19fb0 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64  on-NULL and we d
19fc0 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a  id not find.  **
19fd0 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65   an match on the
19fe0 20 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74   search above, t
19ff0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hen the result m
1a000 75 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20  ust be FALSE..  
1a010 2a 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61 73  */.  if( rRhsHas
1a020 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d  Null && nVector=
1a030 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
1a040 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a050 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48  P_NotNull, rRhsH
1a060 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61  asNull, destIfFa
1a070 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  lse);.    VdbeCo
1a080 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
1a090 20 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66    /* Step 5.  If
1a0a0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
1a0b0 61 62 6f 75 74 20 74 68 65 20 64 69 66 66 65 72  about the differ
1a0c0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c  ence between NUL
1a0d0 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45  L and.  ** FALSE
1a0e0 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
1a0f0 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a  rn false. .  */.
1a100 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73    if( destIfFals
1a110 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20  e==destIfNull ) 
1a120 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1a130 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1a140 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c  ..  /* Step 6: L
1a150 6f 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73  oop through rows
1a160 20 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f   of the RHS.  Co
1a170 6d 70 61 72 65 20 65 61 63 68 20 72 6f 77 20 74  mpare each row t
1a180 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20  o the LHS..  ** 
1a190 49 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f  If any compariso
1a1a0 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  n is NULL, then 
1a1b0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
1a1c0 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a  LL.  If all.  **
1a1d0 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65   comparisons are
1a1e0 20 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20   FALSE then the 
1a1f0 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20  final result is 
1a200 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  FALSE..  **.  **
1a210 20 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48   For a scalar LH
1a220 53 2c 20 69 74 20 69 73 20 73 75 66 66 69 63 69  S, it is suffici
1a230 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73  ent to check jus
1a240 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a  t the first row.
1a250 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e    ** of the RHS.
1a260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
1a270 53 74 65 70 36 20 29 20 73 71 6c 69 74 65 33 56  Step6 ) sqlite3V
1a280 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a290 76 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20  v, destStep6);. 
1a2a0 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
1a2b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a2c0 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72  OP_Rewind, pExpr
1a2d0 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
1a2e0 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f  False);.  VdbeCo
1a2f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
1a300 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20   nVector>1 ){.  
1a310 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20    destNotNull = 
1a320 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1a330 61 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65  abel(v);.  }else
1a340 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65  {.    /* For nVe
1a350 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65  ctor==1, combine
1a360 20 73 74 65 70 73 20 36 20 61 6e 64 20 37 20 62   steps 6 and 7 b
1a370 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  y immediately re
1a380 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46  turning.    ** F
1a390 41 4c 53 45 20 69 66 20 74 68 65 20 66 69 72 73  ALSE if the firs
1a3a0 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  t comparison is 
1a3b0 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20  not NULL */.    
1a3c0 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65  destNotNull = de
1a3d0 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20  stIfFalse;.  }. 
1a3e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
1a3f0 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  tor; i++){.    E
1a400 78 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c  xpr *p;.    Coll
1a410 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
1a420 69 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33  int r3 = sqlite3
1a430 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
1a440 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  e);.    p = sqli
1a450 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
1a460 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
1a470 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1a480 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1a490 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
1a4a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a4b0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1a4c0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69  pExpr->iTable, i
1a4d0 2c 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r3);.    sqlit
1a4e0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1a4f0 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64  OP_Ne, rLhs+i, d
1a500 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a  estNotNull, r3,.
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a520 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
1a530 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
1a540 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1a550 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1a560 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1a570 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d  pParse, r3);.  }
1a580 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a590 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1a5a0 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b   0, destIfNull);
1a5b0 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31  .  if( nVector>1
1a5c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a5d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a5e0 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b  v, destNotNull);
1a5f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a600 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
1a610 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
1a620 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20  , addrTop+1);.  
1a630 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1a640 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20  );..    /* Step 
1a650 37 3a 20 20 49 66 20 77 65 20 72 65 61 63 68 20  7:  If we reach 
1a660 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b  this point, we k
1a670 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72 65 73  now that the res
1a680 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ult must.    ** 
1a690 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20  be false. */.   
1a6a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a6b0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1a6c0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
1a6d0 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20    }..  /* Jumps 
1a6e0 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  here in order to
1a6f0 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f   return true. */
1a700 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
1a710 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 72  mpHere(v, addrTr
1a720 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33  uthOp);..sqlite3
1a730 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
1a740 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21  hed:.  if( rLhs!
1a750 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69  =rLhsOrig ) sqli
1a760 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1a770 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b  g(pParse, rLhs);
1a780 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1a790 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1a7a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1a7b0 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29  , "end IN expr")
1a7c0 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  );.sqlite3ExprCo
1a7d0 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a  deIN_oom_error:.
1a7e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a7f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61  pParse->db, aiMa
1a800 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
1a810 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1a820 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  zAff);.}.#endif 
1a830 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
1a840 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
1a850 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a860 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f  FLOATING_POINT./
1a870 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
1a880 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
1a890 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
1a8a0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
1a8b0 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
1a8c0 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e   by z[0..n-1] in
1a8d0 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
1a8e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20  ..**.** The z[] 
1a8f0 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62  string will prob
1a900 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f  ably not be zero
1a910 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
1a920 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63  t the .** z[n] c
1a930 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72  haracter is guar
1a940 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d  anteed to be som
1a950 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ething that does
1a960 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b   not look.** lik
1a970 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  e the continuati
1a980 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  on of the number
1a990 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a9a0 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a   codeReal(Vdbe *
1a9b0 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
1a9c0 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
1a9d0 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69  , int iMem){.  i
1a9e0 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20  f( ALWAYS(z!=0) 
1a9f0 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
1aa00 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  lue;.    sqlite3
1aa10 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20  AtoF(z, &value, 
1aa20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1aa30 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
1aa40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
1aa50 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
1aa60 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
1aa70 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
1aa80 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
1aa90 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
1aaa0 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
1aab0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1aac0 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
1aad0 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  Real, 0, iMem, 0
1aae0 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
1aaf0 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23  4_REAL);.  }.}.#
1ab00 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  endif.../*.** Ge
1ab10 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
1ab20 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
1ab30 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  put the integer 
1ab40 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74  describe by.** t
1ab50 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e  ext z[0..n-1] in
1ab60 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
1ab70 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a  ..**.** Expr.u.z
1ab80 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20  Token is always 
1ab90 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65  UTF8 and zero-te
1aba0 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  rminated..*/.sta
1abb0 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
1abc0 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  eger(Parse *pPar
1abd0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1abe0 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e   int negFlag, in
1abf0 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20  t iMem){.  Vdbe 
1ac00 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1ac10 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  be;.  if( pExpr-
1ac20 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
1ac30 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  alue ){.    int 
1ac40 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  i = pExpr->u.iVa
1ac50 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  lue;.    assert(
1ac60 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   i>=0 );.    if(
1ac70 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d   negFlag ) i = -
1ac80 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  i;.    sqlite3Vd
1ac90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1aca0 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
1acb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1acc0 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61  nt c;.    i64 va
1acd0 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lue;.    const c
1ace0 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e  har *z = pExpr->
1acf0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73  u.zToken;.    as
1ad00 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
1ad10 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63    c = sqlite3Dec
1ad20 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76  OrHexToI64(z, &v
1ad30 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63  alue);.    if( c
1ad40 3d 3d 31 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20  ==1 || (c==2 && 
1ad50 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28 6e 65  !negFlag) || (ne
1ad60 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d  gFlag && value==
1ad70 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29  SMALLEST_INT64))
1ad80 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1ad90 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1ada0 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
1adb0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1adc0 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
1add0 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
1ade0 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
1adf0 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64   z);.#else.#ifnd
1ae00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48  ef SQLITE_OMIT_H
1ae10 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20  EX_INTEGER.     
1ae20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1ae30 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d  nicmp(z,"0x",2)=
1ae40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1ae50 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1ae60 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72  arse, "hex liter
1ae70 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73  al too big: %s%s
1ae80 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22  ", negFlag?"-":"
1ae90 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ",z);.      }els
1aea0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
1aeb0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
1aec0 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c  l(v, z, negFlag,
1aed0 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a   iMem);.      }.
1aee0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1aef0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  {.      if( negF
1af00 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63  lag ){ value = c
1af10 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  ==2 ? SMALLEST_I
1af20 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d  NT64 : -value; }
1af30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1af40 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
1af50 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65  OP_Int64, 0, iMe
1af60 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75  m, 0, (u8*)&valu
1af70 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1af80 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1af90 20 45 72 61 73 65 20 63 6f 6c 75 6d 6e 2d 63 61   Erase column-ca
1afa0 63 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72  che entry number
1afb0 20 69 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69   i.*/.static voi
1afc0 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61  d cacheEntryClea
1afd0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1afe0 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20 70   int i){.  if( p
1aff0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1b000 5b 69 5d 2e 74 65 6d 70 52 65 67 20 29 7b 0a 20  [i].tempReg ){. 
1b010 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1b020 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
1b030 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
1b040 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eg) ){.      pPa
1b050 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
1b060 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
1b070 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  ] = pParse->aCol
1b080 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20  Cache[i].iReg;. 
1b090 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
1b0a0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  e->nColCache--;.
1b0b0 20 20 69 66 28 20 69 3c 70 50 61 72 73 65 2d 3e    if( i<pParse->
1b0c0 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20  nColCache ){.   
1b0d0 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1b0e0 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  he[i] = pParse->
1b0f0 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65  aColCache[pParse
1b100 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20  ->nColCache];.  
1b110 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
1b120 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
1b130 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
1b140 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
1b150 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
1b160 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
1b170 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
1b180 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
1b190 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1b1a0 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
1b1b0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1b1c0 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
1b1d0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
1b1e0 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
1b1f0 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
1b200 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1b210 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  he *p;..  /* Unl
1b220 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73  ess an error has
1b230 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73   occurred, regis
1b240 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ter numbers are 
1b250 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e  always positive.
1b260 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52   */.  assert( iR
1b270 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  eg>0 || pParse->
1b280 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
1b290 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1b2a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   );.  assert( iC
1b2b0 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33  ol>=-1 && iCol<3
1b2c0 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69  2768 );  /* Fini
1b2d0 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  te column number
1b2e0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53  s */..  /* The S
1b2f0 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
1b300 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20  e flag disables 
1b310 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1b320 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  .  This is used.
1b330 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67    ** for testing
1b340 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66   only - to verif
1b350 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c  y that SQLite al
1b360 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61  ways gets the sa
1b370 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77  me answer.  ** w
1b380 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20  ith and without 
1b390 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1b3a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..  */.  if( Opt
1b3b0 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
1b3c0 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
1b3d0 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
1b3e0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
1b3f0 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20  * First replace 
1b400 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74  any existing ent
1b410 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ry..  **.  ** Ac
1b420 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20  tually, the way 
1b430 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1b440 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73   is currently us
1b450 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61  ed, we are guara
1b460 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  nteed.  ** that 
1b470 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  the object will 
1b480 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65  never already be
1b490 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69   in cache.  Veri
1b4a0 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  fy this guarante
1b4b0 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  e..  */.#ifndef 
1b4c0 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  NDEBUG.  for(i=0
1b4d0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1b4e0 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d  Cache; i<pParse-
1b4f0 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c  >nColCache; i++,
1b500 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   p++){.    asser
1b510 74 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54  t( p->iTable!=iT
1b520 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e  ab || p->iColumn
1b530 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65  !=iCol );.  }.#e
1b540 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1b550 65 20 63 61 63 68 65 20 69 73 20 61 6c 72 65 61  e cache is alrea
1b560 64 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74 65 20  dy full, delete 
1b570 74 68 65 20 6c 65 61 73 74 20 72 65 63 65 6e 74  the least recent
1b580 6c 79 20 75 73 65 64 20 65 6e 74 72 79 20 2a 2f  ly used entry */
1b590 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1b5a0 43 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49 54 45  ColCache>=SQLITE
1b5b0 5f 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b 0a 20  _N_COLCACHE ){. 
1b5c0 20 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66     minLru = 0x7f
1b5d0 66 66 66 66 66 66 3b 0a 20 20 20 20 69 64 78 4c  ffffff;.    idxL
1b5e0 72 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72  ru = -1;.    for
1b5f0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1b600 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1b610 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1b620 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20  i++, p++){.     
1b630 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c   if( p->lru<minL
1b640 72 75 20 29 7b 0a 20 20 20 20 20 20 20 20 69 64  ru ){.        id
1b650 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20  xLru = i;.      
1b660 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72    minLru = p->lr
1b670 75 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  u;.      }.    }
1b680 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65  .    p = &pParse
1b690 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c  ->aColCache[idxL
1b6a0 72 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ru];.  }else{.  
1b6b0 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
1b6c0 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65 2d  ColCache[pParse-
1b6d0 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20  >nColCache++];. 
1b6e0 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
1b6f0 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68   new entry to th
1b700 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63  e end of the cac
1b710 68 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76 65  he */.  p->iLeve
1b720 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
1b730 68 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e 69 54  heLevel;.  p->iT
1b740 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 70  able = iTab;.  p
1b750 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
1b760 3b 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52  ;.  p->iReg = iR
1b770 65 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52 65 67  eg;.  p->tempReg
1b780 20 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d   = 0;.  p->lru =
1b790 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
1b7a0 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  nt++;.}../*.** I
1b7b0 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65 67  ndicate that reg
1b7c0 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20 69  isters between i
1b7d0 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31  Reg..iReg+nReg-1
1b7e0 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77   are being overw
1b7f0 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65  ritten..** Purge
1b800 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65   the range of re
1b810 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65  gisters from the
1b820 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
1b830 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1b840 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61  prCacheRemove(Pa
1b850 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1b860 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
1b870 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
1b880 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73 65   while( i<pParse
1b890 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20  ->nColCache ){. 
1b8a0 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
1b8b0 63 68 65 20 2a 70 20 3d 20 26 70 50 61 72 73 65  che *p = &pParse
1b8c0 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a  ->aColCache[i];.
1b8d0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
1b8e0 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52  >= iReg && p->iR
1b8f0 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29  eg < iReg+nReg )
1b900 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
1b910 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
1b920 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
1b930 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a       i++;.    }.
1b940 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
1b950 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65 6e  ember the curren
1b960 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63  t column cache c
1b970 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77  ontext.  Any new
1b980 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a   entries added.*
1b990 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  * added to the c
1b9a0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65  olumn cache afte
1b9b0 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20  r this call are 
1b9c0 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65  removed when the
1b9d0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
1b9e0 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f  g pop occurs..*/
1b9f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1ba00 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73 65  rCachePush(Parse
1ba10 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
1ba20 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1ba30 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ++;.#ifdef SQLIT
1ba40 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
1ba50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
1ba60 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
1ba70 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70  opTrace ){.    p
1ba80 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20 25  rintf("PUSH to %
1ba90 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43  d\n", pParse->iC
1baa0 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a  acheLevel);.  }.
1bab0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
1bac0 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20  Remove from the 
1bad0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79  column cache any
1bae0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 65   entries that we
1baf0 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20 74  re added since t
1bb00 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  he.** the previo
1bb10 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  us sqlite3ExprCa
1bb20 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69 6f  chePush operatio
1bb30 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
1bb40 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74  ds, restore.** t
1bb50 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65 20  he cache to the 
1bb60 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1bb70 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  prior the most r
1bb80 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76  ecent Push..*/.v
1bb90 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1bba0 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70  achePop(Parse *p
1bbb0 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 20  Parse){.  int i 
1bbc0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
1bbd0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1bbe0 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73  el>=1 );.  pPars
1bbf0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d  e->iCacheLevel--
1bc00 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1bc10 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
1bc20 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
1bc30 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
1bc40 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
1bc50 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c  ntf("POP  to %d\
1bc60 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63  n", pParse->iCac
1bc70 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65  heLevel);.  }.#e
1bc80 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20 69 3c  ndif.  while( i<
1bc90 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1bca0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  e ){.    if( pPa
1bcb0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1bcc0 5d 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d  ].iLevel>pParse-
1bcd0 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a  >iCacheLevel ){.
1bce0 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
1bcf0 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69 29  Clear(pParse, i)
1bd00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bd10 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     i++;.    }.  
1bd20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
1bd30 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20  a cached column 
1bd40 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20  is reused, make 
1bd50 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65  sure that its re
1bd60 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20  gister is.** no 
1bd70 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65  longer available
1bd80 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73   as a temp regis
1bd90 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38  ter.  ticket #38
1bda0 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a  79:  that same.*
1bdb0 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74  * register might
1bdc0 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
1bdd0 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
1bde0 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20  ces, so be sure 
1bdf0 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61  to.** get them a
1be00 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
1be10 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1be20 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50  chePinRegister(P
1be30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1be40 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
1be50 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
1be60 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
1be70 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1be80 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
1be90 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
1bea0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
1beb0 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
1bec0 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  {.      p->tempR
1bed0 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
1bee0 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  }.}../* Generate
1bef0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1bf00 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74  load into regist
1bf10 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75  er regOut a valu
1bf20 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70  e that is.** app
1bf30 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
1bf40 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75   iIdxCol-th colu
1bf50 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  mn of index pIdx
1bf60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1bf70 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64  3ExprCodeLoadInd
1bf80 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  exColumn(.  Pars
1bf90 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54  e *pParse,  /* T
1bfa0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1bfb0 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
1bfc0 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69  Idx,    /* The i
1bfd0 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d  ndex whose colum
1bfe0 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65  n is to be loade
1bff0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  d */.  int iTabC
1c000 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ur,    /* Cursor
1c010 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
1c020 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  able row */.  in
1c030 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a  t iIdxCol,    /*
1c040 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   The column of t
1c050 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c  he index to be l
1c060 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  oaded */.  int r
1c070 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74  egOut      /* St
1c080 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f  ore the index co
1c090 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68  lumn value in th
1c0a0 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
1c0b0 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20  {.  i16 iTabCol 
1c0c0 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
1c0d0 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28  [iIdxCol];.  if(
1c0e0 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50   iTabCol==XN_EXP
1c0f0 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
1c100 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
1c110 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1c120 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e  Idx->aColExpr->n
1c130 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a  Expr>iIdxCol );.
1c140 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
1c150 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 20 2b  fTab = iTabCur +
1c160 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   1;.    sqlite3E
1c170 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72  xprCodeCopy(pPar
1c180 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  se, pIdx->aColEx
1c190 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70  pr->a[iIdxCol].p
1c1a0 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  Expr, regOut);. 
1c1b0 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
1c1c0 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Tab = 0;.  }else
1c1d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1c1e0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
1c1f0 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56  Table(pParse->pV
1c200 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c  dbe, pIdx->pTabl
1c210 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20  e, iTabCur,.    
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c240 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29  iTabCol, regOut)
1c250 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1c260 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1c270 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  extract the valu
1c280 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  e of the iCol-th
1c290 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
1c2a0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
1c2b0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1c2c0 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56  lumnOfTable(.  V
1c2d0 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f  dbe *v,        /
1c2e0 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
1c2f0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1c300 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
1c310 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
1c320 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
1c330 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  alue */.  int iT
1c340 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65  abCur,    /* The
1c350 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20   table cursor.  
1c360 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72  Or the PK cursor
1c370 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
1c380 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ID */.  int iCol
1c390 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ,       /* Index
1c3a0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   of the column t
1c3b0 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69  o extract */.  i
1c3c0 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
1c3d0 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
1c3e0 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65  lue into this re
1c3f0 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
1c400 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
1c410 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c420 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1c430 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c  , iTabCur, iCol,
1c440 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72 65   regOut);.    re
1c450 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
1c460 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d  iCol<0 || iCol==
1c470 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
1c480 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c490 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
1c4a0 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75  , iTabCur, regOu
1c4b0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
1c4c0 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74   int op = IsVirt
1c4d0 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
1c4e0 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75  Column : OP_Colu
1c4f0 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  mn;.    int x = 
1c500 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48  iCol;.    if( !H
1c510 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
1c520 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
1c530 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73  ) ){.      x = s
1c540 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1c550 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61  dex(sqlite3Prima
1c560 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
1c570 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , iCol);.    }. 
1c580 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c590 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62  dOp3(v, op, iTab
1c5a0 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b  Cur, x, regOut);
1c5b0 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
1c5c0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1c5d0 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
1c5e0 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65  , pTab, iCol, re
1c5f0 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
1c600 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c610 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  e that will extr
1c620 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  act the iColumn-
1c630 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  th column from.*
1c640 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  * table pTab and
1c650 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
1c660 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67  n value in a reg
1c670 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e  ister. .**.** An
1c680 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
1c690 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  to store the col
1c6a0 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67  umn value in reg
1c6b0 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 69  ister iReg.  Thi
1c6c0 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61  s.** is not gara
1c6d0 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f  nteeed for GetCo
1c6e0 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73  lumn() - the res
1c6f0 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65  ult can be store
1c700 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69  d in.** any regi
1c710 73 74 65 72 2e 20 20 42 75 74 20 74 68 65 20 72  ster.  But the r
1c720 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74  esult is guarant
1c730 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72  eed to land in r
1c740 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20  egister iReg.** 
1c750 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52  for GetColumnToR
1c760 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  eg()..**.** Ther
1c770 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
1c780 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
1c790 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
1c7a0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1c7b0 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
1c7c0 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
1c7d0 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
1c7e0 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
1c7f0 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20  e rowid..*/.int 
1c800 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1c810 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
1c820 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
1c830 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
1c840 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1c850 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
1c860 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
1c870 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1c880 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
1c890 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
1c8a0 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
1c8b0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1c8c0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
1c8d0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1c8e0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1c8f0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1c900 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1c910 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
1c920 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
1c930 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  re */.  u8 p5   
1c940 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76           /* P5 v
1c950 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  alue for OP_Colu
1c960 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b  mn + FLAGS */.){
1c970 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1c980 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1c990 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
1c9a0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
1c9b0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1c9c0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70  ->aColCache; i<p
1c9d0 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1c9e0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1c9f0 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d 3d   if( p->iTable==
1ca00 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f  iTable && p->iCo
1ca10 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn==iColumn ){
1ca20 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
1ca30 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
1ca40 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
1ca50 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
1ca60 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70  gister(pParse, p
1ca70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72  ->iReg);.      r
1ca80 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20  eturn p->iReg;. 
1ca90 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73     }.  }  .  ass
1caa0 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
1cab0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1cac0 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
1cad0 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20  , pTab, iTable, 
1cae0 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
1caf0 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20    if( p5 ){.    
1cb00 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1cb10 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65  eP5(v, p5);.  }e
1cb20 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69  lse{   .    sqli
1cb30 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1cb40 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65  e(pParse, iTable
1cb50 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
1cb60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1cb70 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  Reg;.}.void sqli
1cb80 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1cb90 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61 72  lumnToReg(.  Par
1cba0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1cbb0 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1cbc0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1cbd0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1cbe0 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1cbf0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1cc00 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1cc10 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1cc20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1cc30 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1cc40 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1cc50 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1cc60 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1cc70 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1cc80 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1cc90 20 69 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a   iReg         /*
1cca0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1ccb0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1ccc0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1ccd0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
1cce0 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c  arse, pTab, iCol
1ccf0 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52 65  umn, iTable, iRe
1cd00 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31 21  g, 0);.  if( r1!
1cd10 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65 33 56  =iReg ) sqlite3V
1cd20 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
1cd30 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
1cd40 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a  y, r1, iReg);.}.
1cd50 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c  ../*.** Clear al
1cd60 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65  l column cache e
1cd70 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ntries..*/.void 
1cd80 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1cd90 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61  Clear(Parse *pPa
1cda0 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  rse){.  int i;..
1cdb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1cdc0 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
1cdd0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1cde0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1cdf0 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
1ce00 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20  f("CLEAR\n");.  
1ce10 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
1ce20 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  =0; i<pParse->nC
1ce30 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20  olCache; i++){. 
1ce40 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
1ce50 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70  ColCache[i].temp
1ce60 52 65 67 0a 20 20 20 20 20 26 26 20 70 50 61 72  Reg.     && pPar
1ce70 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
1ce80 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
1ce90 54 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b 0a  TempReg).    ){.
1cea0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
1ceb0 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
1cec0 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50  nTempReg++] = pP
1ced0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1cee0 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  i].iReg;.    }. 
1cef0 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f   }.  pParse->nCo
1cf00 6c 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  lCache = 0;.}../
1cf10 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20  *.** Record the 
1cf20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66  fact that an aff
1cf30 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73  inity change has
1cf40 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f   occurred on iCo
1cf50 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  unt.** registers
1cf60 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69   starting with i
1cf70 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Start..*/.void s
1cf80 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1cf90 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61  ffinityChange(Pa
1cfa0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1cfb0 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f   iStart, int iCo
1cfc0 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  unt){.  sqlite3E
1cfd0 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1cfe0 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69  Parse, iStart, i
1cff0 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Count);.}../*.**
1d000 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1d010 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66  o move content f
1d020 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46  rom registers iF
1d030 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67  rom...iFrom+nReg
1d040 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54  -1.** over to iT
1d050 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b  o..iTo+nReg-1. K
1d060 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  eep the column c
1d070 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e  ache up-to-date.
1d080 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d090 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72  ExprCodeMove(Par
1d0a0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1d0b0 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20  iFrom, int iTo, 
1d0c0 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73  int nReg){.  ass
1d0d0 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b  ert( iFrom>=iTo+
1d0e0 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52  nReg || iFrom+nR
1d0f0 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c  eg<=iTo );.  sql
1d100 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1d110 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1d120 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54  _Move, iFrom, iT
1d130 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69  o, nReg);.  sqli
1d140 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1d150 76 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f 6d  ve(pParse, iFrom
1d160 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20  , nReg);.}..#if 
1d170 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1d180 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1d190 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45  (SQLITE_COVERAGE
1d1a0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
1d1b0 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
1d1c0 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
1d1d0 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f  range iFrom..iTo
1d1e0 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20   (inclusive).** 
1d1f0 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
1d200 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  of the column ca
1d210 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
1d220 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1d230 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1d240 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d  and testcase() m
1d250 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e  acros only.** an
1d260 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  d does not appea
1d270 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75  r in a normal bu
1d280 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ild..*/.static i
1d290 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  nt usedAsColumnC
1d2a0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
1d2b0 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
1d2c0 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69  nt iTo){.  int i
1d2d0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
1d2e0 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
1d2f0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1d300 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
1d310 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
1d320 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
1d330 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
1d340 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26    if( r>=iFrom &
1d350 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72  & r<=iTo ) retur
1d360 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53  n 1;    /*NO_TES
1d370 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  T*/.  }.  return
1d380 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1d390 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20  SQLITE_DEBUG || 
1d3a0 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
1d3b0 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  TEST */.../*.** 
1d3c0 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61 72  Convert a scalar
1d3d0 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
1d3e0 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45   to a TK_REGISTE
1d3f0 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a  R referencing.**
1d400 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20   register iReg. 
1d410 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1d420 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 52 65   ensure that iRe
1d430 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  g already contai
1d440 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ns.** the correc
1d450 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
1d460 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73  expression..*/.s
1d470 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 54  tatic void exprT
1d480 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20 2a  oRegister(Expr *
1d490 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  p, int iReg){.  
1d4a0 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a  p->op2 = p->op;.
1d4b0 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47    p->op = TK_REG
1d4c0 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62  ISTER;.  p->iTab
1d4d0 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70  le = iReg;.  Exp
1d4e0 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  rClearProperty(p
1d4f0 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f  , EP_Skip);.}../
1d500 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 6e  *.** Evaluate an
1d510 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69 74   expression (eit
1d520 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20  her a vector or 
1d530 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
1d540 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a  ion) and store.*
1d550 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  * the result in 
1d560 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d 70  continguous temp
1d570 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 2e  orary registers.
1d580 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
1d590 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72  ex of.** the fir
1d5a0 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65 64  st register used
1d5b0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
1d5c0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sult..**.** If t
1d5d0 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75  he returned resu
1d5e0 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 61  lt register is a
1d5f0 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c 61   temporary scala
1d600 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69  r, then also wri
1d610 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69 73  te.** that regis
1d620 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  ter number into 
1d630 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49 66  *piFreeable.  If
1d640 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65   the returned re
1d650 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a 2a  sult register.**
1d660 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
1d670 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65 78  ary or if the ex
1d680 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65  pression is a ve
1d690 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65 65  ctor set *piFree
1d6a0 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f  able.** to 0..*/
1d6b0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
1d6c0 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73 65  CodeVector(Parse
1d6d0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1d6e0 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61 62  p, int *piFreeab
1d6f0 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73 75  le){.  int iResu
1d700 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c  lt;.  int nResul
1d710 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  t = sqlite3ExprV
1d720 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20  ectorSize(p);.  
1d730 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29  if( nResult==1 )
1d740 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20  {.    iResult = 
1d750 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d760 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  emp(pParse, p, p
1d770 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65  iFreeable);.  }e
1d780 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65 65  lse{.    *piFree
1d790 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  able = 0;.    if
1d7a0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ( p->op==TK_SELE
1d7b0 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  CT ){.#if SQLITE
1d7c0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1d7d0 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 30       iResult = 0
1d7e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 52  ;.#else.      iR
1d7f0 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43  esult = sqlite3C
1d800 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
1d810 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 23  rse, p, 0, 0);.#
1d820 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
1d830 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1d840 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70 50      iResult = pP
1d850 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
1d860 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1d870 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20   += nResult;.   
1d880 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
1d890 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  esult; i++){.   
1d8a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d8b0 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70  CodeFactorable(p
1d8c0 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73  Parse, p->x.pLis
1d8d0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
1d8e0 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  +iResult);.     
1d8f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1d900 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d  eturn iResult;.}
1d910 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1d920 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
1d930 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
1d940 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
1d950 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
1d960 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
1d970 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1d980 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
1d990 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
1d9a0 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
1d9b0 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
1d9c0 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
1d9d0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
1d9e0 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
1d9f0 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c  antee that resul
1da00 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74  ts will.** be st
1da10 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20  ored in target. 
1da20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68   The result migh
1da30 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73  t be stored in s
1da40 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67  ome other.** reg
1da50 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63  ister if it is c
1da60 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20  onvenient to do 
1da70 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  so.  The calling
1da80 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
1da90 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
1daa0 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65  rn code and move
1dab0 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
1dac0 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72  the desired.** r
1dad0 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
1dae0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1daf0 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61  arget(Parse *pPa
1db00 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1db10 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1db20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1db30 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68  e->pVdbe;  /* Th
1db40 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e VM under const
1db50 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
1db60 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1db70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
1db80 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
1db90 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20   */.  int inReg 
1dba0 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20  = target;       
1dbb0 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65  /* Results store
1dbc0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e  d in register in
1dbd0 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Reg */.  int reg
1dbe0 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20  Free1 = 0;      
1dbf0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
1dc00 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
1dc10 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
1dc20 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  /.  int regFree2
1dc30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1dc40 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
1dc50 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
1dc60 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1dc70 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20  nt r1, r2;      
1dc80 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69           /* Vari
1dc90 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ous register num
1dca0 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 74  bers */.  Expr t
1dcb0 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  empX;           
1dcc0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
1dcd0 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
1dce0 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20 30   */.  int p5 = 0
1dcf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
1dd00 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
1dd10 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
1dd20 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
1dd30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1dd40 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1dd50 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
1dd60 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  n 0;.  }..  if( 
1dd70 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
1dd80 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1dd90 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
1dda0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20  pExpr->op;.  }. 
1ddb0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1ddc0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
1ddd0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41  OLUMN: {.      A
1dde0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1ddf0 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
1de00 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
1de10 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1de20 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
1de30 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67  aCol[pExpr->iAgg
1de40 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  ];.      if( !pA
1de50 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
1de60 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  de ){.        as
1de70 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d  sert( pCol->iMem
1de80 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  >0 );.        re
1de90 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b  turn pCol->iMem;
1dea0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1deb0 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f   pAggInfo->useSo
1dec0 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20  rtingIdx ){.    
1ded0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1dee0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1def0 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f  mn, pAggInfo->so
1df00 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20  rtingIdxPTab,.  
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1df30 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
1df40 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1df50 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1df60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
1df70 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  * Otherwise, fal
1df80 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
1df90 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a  TK_COLUMN case *
1dfa0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
1dfb0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
1dfc0 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70      int iTab = p
1dfd0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
1dfe0 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20 29      if( iTab<0 )
1dff0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
1e000 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c 30  arse->iSelfTab<0
1e010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1e020 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43   Generating CHEC
1e030 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72  K constraints or
1e040 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20   inserting into 
1e050 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f  partial index */
1e060 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1e070 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  n pExpr->iColumn
1e080 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66   - pParse->iSelf
1e090 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  Tab;.        }el
1e0a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1e0b0 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65   Coding an expre
1e0c0 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61  ssion that is pa
1e0d0 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77  rt of an index w
1e0e0 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  here column name
1e0f0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
1e100 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65  n the index refe
1e110 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74  r to the table t
1e120 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65  o which the inde
1e130 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20  x belongs */.   
1e140 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50         iTab = pP
1e150 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 2d  arse->iSelfTab -
1e160 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
1e170 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1e180 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
1e190 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
1e1a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
1e1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1e1e0 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20  iTab, target,.  
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1e210 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a  pr->op2);.    }.
1e220 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
1e230 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  GER: {.      cod
1e240 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
1e250 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65   pExpr, 0, targe
1e260 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1e270 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1e280 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e290 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1e2a0 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
1e2b0 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
1e2c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e2d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e2e0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1e2f0 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
1e300 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1e310 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1e320 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e330 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1e340 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
1e350 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1e360 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e370 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e380 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e390 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
1e3a0 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
1e3b0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1e3c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e3d0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1e3e0 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
1e3f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1e400 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e410 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
1e420 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e430 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
1e440 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e450 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
1e460 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
1e470 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
1e480 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1e490 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *z;.      char *
1e4a0 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73  zBlob;.      ass
1e4b0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e4c0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e4d0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1e4e0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e4f0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1e500 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a  x' || pExpr->u.z
1e510 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b  Token[0]=='X' );
1e520 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e530 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1e540 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1e550 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a   z = &pExpr->u.z
1e560 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20  Token[2];.      
1e570 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
1e580 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20  n30(z) - 1;.    
1e590 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d    assert( z[n]==
1e5a0 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42  '\'' );.      zB
1e5b0 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
1e5c0 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
1e5d0 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
1e5e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e5f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
1e600 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
1e610 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
1e620 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65  NAMIC);.      re
1e630 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e640 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
1e650 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
1e660 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e670 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1e680 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1e690 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1e6a0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1e6b0 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20  Token!=0 );.    
1e6c0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e6d0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
1e6e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e6f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e700 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
1e710 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
1e720 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
1e730 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
1e740 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  !=0 ){.        c
1e750 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
1e760 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f  qlite3VListNumTo
1e770 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c  Name(pParse->pVL
1e780 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ist, pExpr->iCol
1e790 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73  umn);.        as
1e7a0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1e7b0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c  Token[0]=='?' ||
1e7c0 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
1e7d0 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29  .zToken, z)==0 )
1e7e0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
1e7f0 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b  ->pVList[0] = 0;
1e800 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69   /* Indicate VLi
1e810 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72  st may no longer
1e820 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1e830 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e840 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
1e850 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54  char*)z, P4_STAT
1e860 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
1e870 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e890 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
1e8a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
1e8b0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1e8c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1e8d0 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
1e8e0 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
1e8f0 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1e900 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
1e910 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
1e920 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
1e930 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1e940 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1e950 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e960 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
1e970 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1e980 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
1e990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e9a0 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
1e9b0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
1e9c0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
1e9d0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
1e9e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e9f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61  eAddOp2(v, OP_Ca
1ea00 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  st, target,.    
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e      sqlite3Affin
1ea30 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
1ea40 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20  .zToken, 0));.  
1ea50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73      testcase( us
1ea60 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
1ea70 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69  pParse, inReg, i
1ea80 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73  nReg) );.      s
1ea90 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1eaa0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1eab0 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b  arse, inReg, 1);
1eac0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e  .      return in
1ead0 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  Reg;.    }.#endi
1eae0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1eaf0 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
1eb00 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
1eb10 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
1eb20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
1eb30 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
1eb40 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53  NE;.      p5 = S
1eb50 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
1eb60 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f      /* fall-thro
1eb70 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
1eb80 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1eb90 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1eba0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1ebb0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1ebc0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1ebd0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45  TK_EQ: {.      E
1ebe0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1ebf0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1ec00 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1ec10 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20  IsVector(pLeft) 
1ec20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56  ){.        codeV
1ec30 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61  ectorCompare(pPa
1ec40 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1ec50 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20  et, op, p5);.   
1ec60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ec70 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1ec80 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ec90 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72  e, pLeft, &regFr
1eca0 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1ecb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ecc0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1ecd0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1ece0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1ecf0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1ed00 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78  arse, pLeft, pEx
1ed10 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1ed30 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
1ed40 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b  E_STOREP2 | p5);
1ed50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ed60 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
1ed70 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1ed80 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1ed90 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
1eda0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1edb0 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
1edc0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1edd0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1ede0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
1edf0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ee00 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
1ee10 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1ee20 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1ee30 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
1ee40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ee50 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
1ee60 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1ee70 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1ee80 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
1ee90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1eea0 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
1eeb0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
1eec0 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
1eed0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
1eee0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1eef0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
1ef00 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
1ef10 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1ef20 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
1ef30 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1ef40 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1ef50 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1ef60 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1ef70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ef80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ef90 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
1efa0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
1efb0 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
1efc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
1efd0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
1efe0 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
1eff0 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
1f000 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
1f010 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
1f020 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
1f030 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
1f040 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
1f050 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
1f060 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
1f070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f080 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20  _AND==OP_And ); 
1f090 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1f0a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ase( op==TK_AND 
1f0b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f0c0 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1f0e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f  stcase( op==TK_O
1f0f0 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
1f100 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
1f110 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  dd );           
1f120 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f130 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61  _PLUS );.      a
1f140 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
1f150 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20  =OP_Subtract ); 
1f160 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f170 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
1f180 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
1f190 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
1f1a0 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1f1b0 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
1f1c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f1d0 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
1f1e0 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74  And );      test
1f1f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1f200 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
1f210 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
1f220 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20  P_BitOr );      
1f230 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f240 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20  TK_BITOR );.    
1f250 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
1f260 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
1f270 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f280 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b   op==TK_SLASH );
1f290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f2a0 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
1f2b0 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74  ftLeft );   test
1f2c0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48  case( op==TK_LSH
1f2d0 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
1f2e0 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
1f2f0 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
1f300 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f310 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
1f320 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
1f330 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
1f340 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1f350 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
1f360 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1f370 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f380 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f390 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f3a0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1f3b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f3c0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f3d0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1f3e0 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
1f3f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1f400 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
1f410 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
1f420 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f430 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1f440 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1f450 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1f460 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f470 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
1f480 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1f490 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1f4a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
1f4b0 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
1f4c0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
1f4d0 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
1f4e0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1f4f0 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74  rse, pLeft, 1, t
1f500 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1f510 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23  return target;.#
1f520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f530 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1f540 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  T.      }else if
1f550 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
1f560 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
1f570 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1f580 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1f590 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1f5a0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
1f5b0 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54  l(v, pLeft->u.zT
1f5c0 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  oken, 1, target)
1f5d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f5e0 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a   target;.#endif.
1f5f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f600 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20       tempX.op = 
1f610 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TK_INTEGER;.    
1f620 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20      tempX.flags 
1f630 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
1f640 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20  _TokenOnly;.    
1f650 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c      tempX.u.iVal
1f660 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ue = 0;.        
1f670 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f680 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f690 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
1f6a0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  e1);.        r2 
1f6b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f6c0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f6d0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1f6e0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
1f6f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f700 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
1f710 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1f720 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f730 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1f740 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1f750 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f760 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
1f770 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
1f780 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
1f790 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
1f7a0 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65  P_BitNot );   te
1f7b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1f7c0 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61  ITNOT );.      a
1f7d0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f  ssert( TK_NOT==O
1f7e0 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20  P_Not );        
1f7f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f800 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  K_NOT );.      r
1f810 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1f820 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1f830 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1f840 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1f850 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f860 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  e1==0 );.      s
1f870 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f880 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65  (v, op, r1, inRe
1f890 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
1f8a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f8b0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
1f8c0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1f8d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
1f8e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f8f0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
1f900 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
1f910 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1f920 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
1f930 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
1f940 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
1f950 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1f960 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
1f970 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f980 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1f990 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1f9a0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1f9b0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f9c0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f9d0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1f9e0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f9f0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1fa00 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
1fa10 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
1fa20 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1fa30 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1fa40 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
1fa50 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1fa60 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
1fa70 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  TNULL);.      sq
1fa80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1fa90 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1faa0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1fab0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1fac0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
1fad0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fae0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
1faf0 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
1fb00 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
1fb10 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
1fb20 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
1fb30 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
1fb40 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1fb50 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1fb60 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1fb70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1fb80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1fb90 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
1fba0 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
1fbb0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1fbc0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1fbd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1fbe0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
1fbf0 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
1fc00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1fc10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fc20 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
1fc30 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
1fc40 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
1fc50 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
1fc60 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1fc70 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b        int nFarg;
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc90 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69  Number of functi
1fca0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1fcb0 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
1fcc0 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Def;         /* 
1fcd0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  The function def
1fce0 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  inition object *
1fcf0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
1fd00 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f  ar *zId;       /
1fd10 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
1fd20 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  ame */.      u32
1fd30 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20   constMask = 0; 
1fd40 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66      /* Mask of f
1fd50 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1fd60 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74  s that are const
1fd70 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ant */.      int
1fd80 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1fd90 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1fda0 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ter */.      sql
1fdb0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1fdc0 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
1fdd0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1fde0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  on */.      u8 e
1fdf0 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20  nc = ENC(db);   
1fe00 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
1fe10 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20  ncoding used by 
1fe20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
1fe30 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
1fe40 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a  pColl = 0;    /*
1fe50 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   A collating seq
1fe60 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20  uence */..      
1fe70 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  if( ConstFactorO
1fe80 6b 28 70 50 61 72 73 65 29 20 26 26 20 73 71 6c  k(pParse) && sql
1fe90 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
1fea0 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29  ntNotJoin(pExpr)
1feb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
1fec0 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  QL functions can
1fed0 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20 53   be expensive. S
1fee0 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f  o try to move co
1fef0 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73  nstant functions
1ff00 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 20  .        ** out 
1ff10 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
1ff20 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  p, even if that 
1ff30 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20 4f  means an extra O
1ff40 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20  P_Copy. */.     
1ff50 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1ff60 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
1ff70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d  pParse, pExpr, -
1ff80 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1ff90 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1ffa0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1ffb0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1ffc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
1ffd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1ffe0 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
1fff0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61  ) ){.        pFa
20000 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rg = 0;.      }e
20010 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
20020 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
20030 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
20040 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67     nFarg = pFarg
20050 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20   ? pFarg->nExpr 
20060 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  : 0;.      asser
20070 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
20080 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
20090 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
200a0 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e   zId = pExpr->u.
200b0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44  zToken;.      pD
200c0 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
200d0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64  Function(db, zId
200e0 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
200f0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
20100 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53  ENABLE_UNKNOWN_S
20110 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20  QL_FUNCTION.    
20120 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26    if( pDef==0 &&
20130 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
20140 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
20150 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
20160 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e  nction(db, "unkn
20170 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63  own", nFarg, enc
20180 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
20190 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
201a0 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e  Def==0 || pDef->
201b0 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a  xFinalize!=0 ){.
201c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
201d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
201e0 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f  "unknown functio
201f0 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a  n: %s()", zId);.
20200 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20210 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
20220 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63   Attempt a direc
20230 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
20240 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
20250 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a   COALESCE() and.
20260 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28        ** IFNULL(
20270 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  ) functions.  Th
20280 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65  is avoids unnece
20290 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e  ssary evaluation
202a0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67   of.      ** arg
202b0 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20  uments past the 
202c0 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  first non-NULL a
202d0 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
202e0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
202f0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
20300 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
20310 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  CE ){.        in
20320 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20  t endCoalesce = 
20330 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
20340 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
20350 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
20360 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
20370 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
20380 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
20390 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
203a0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
203b0 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
203c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
203d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
203e0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
203f0 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
20400 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
20410 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
20420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20430 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
20440 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29  arse, target, 1)
20450 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
20460 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
20470 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
20480 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20490 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
204a0 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74  g->a[i].pExpr, t
204b0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
204c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
204d0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
204e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
204f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
20500 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
20510 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
20520 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
20530 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55  ..      /* The U
20540 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69  NLIKELY() functi
20550 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
20560 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
20570 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
20580 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
20590 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
205a0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
205b0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
205c0 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
205d0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  Y ){.        ass
205e0 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b  ert( nFarg>=1 );
205f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20600 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20610 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 46  arget(pParse, pF
20620 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
20630 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20640 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
20650 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20  _DEBUG.      /* 
20660 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20 66  The AFFINITY() f
20670 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74 65  unction evaluate
20680 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68  s to a string th
20690 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20 20  at describes.   
206a0 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20 61     ** the type a
206b0 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 61  ffinity of the a
206c0 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 69  rgument.  This i
206d0 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
206e0 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ng of.      ** t
206f0 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20 6c  he SQLite type l
20700 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ogic..      */. 
20710 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
20720 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
20730 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 20  E_FUNC_AFFINITY 
20740 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
20750 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d   char *azAff[] =
20760 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74   { "blob", "text
20770 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22 69  ", "numeric", "i
20780 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22 20  nteger", "real" 
20790 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  };.        char 
207a0 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73  aff;.        ass
207b0 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
207c0 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 73  .        aff = s
207d0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
207e0 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  ty(pFarg->a[0].p
207f0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
20800 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
20810 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20  ring(v, target, 
20820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
20840 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53  ff ? azAff[aff-S
20850 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20  QLITE_AFF_BLOB] 
20860 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20  : "none");.     
20870 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
20880 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
20890 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
208a0 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
208b0 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32          if( i<32
208c0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
208d0 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d  sConstant(pFarg-
208e0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
208f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
20900 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20  se( i==31 );.   
20910 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
20920 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29   |= MASKBIT32(i)
20930 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20940 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
20950 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
20960 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29  E_FUNC_NEEDCOLL)
20970 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  !=0 && !pColl ){
20980 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
20990 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
209a0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46  llSeq(pParse, pF
209b0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
209c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
209d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
209e0 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arg ){.        i
209f0 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a  f( constMask ){.
20a00 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70            r1 = p
20a10 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
20a20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
20a30 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a  >nMem += nFarg;.
20a40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20a50 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71           r1 = sq
20a60 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
20a70 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29  e(pParse, nFarg)
20a80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
20a90 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67       /* For leng
20aa0 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28  th() and typeof(
20ab0 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68  ) functions with
20ac0 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65   a column argume
20ad0 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  nt,.        ** s
20ae0 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65  et the P5 parame
20af0 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f  ter to the OP_Co
20b00 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f  lumn opcode to O
20b10 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a  PFLAG_LENGTHARG.
20b20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50          ** or OP
20b30 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72  FLAG_TYPEOFARG r
20b40 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20  espectively, to 
20b50 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72  avoid unnecessar
20b60 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a  y data.        *
20b70 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20  * loading..     
20b80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
20b90 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
20ba0 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e  gs & (SQLITE_FUN
20bb0 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f  C_LENGTH|SQLITE_
20bc0 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30  FUNC_TYPEOF))!=0
20bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
20be0 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20   exprOp;.       
20bf0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
20c00 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
20c10 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e   assert( pFarg->
20c20 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
20c30 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f  .          exprO
20c40 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  p = pFarg->a[0].
20c50 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20  pExpr->op;.     
20c60 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d       if( exprOp=
20c70 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78  =TK_COLUMN || ex
20c80 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  prOp==TK_AGG_COL
20c90 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
20ca0 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
20cb0 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f  E_FUNC_LENGTH==O
20cc0 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
20cd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
20ce0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
20cf0 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41  NC_TYPEOF==OPFLA
20d00 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20  G_TYPEOFARG );. 
20d10 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
20d20 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46  ase( pDef->funcF
20d30 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45  lags & OPFLAG_LE
20d40 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
20d50 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b         pFarg->a[
20d60 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20  0].pExpr->op2 = 
20d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20d80 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61     pDef->funcFla
20d90 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e  gs & (OPFLAG_LEN
20da0 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59  GTHARG|OPFLAG_TY
20db0 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
20dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
20dd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20de0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
20df0 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69  arse);     /* Ti
20e00 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
20e10 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  e */.        sql
20e20 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
20e30 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61  List(pParse, pFa
20e40 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20 20  rg, r1, 0,.     
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e60 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
20e70 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54  E_ECEL_DUP|SQLIT
20e80 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a  E_ECEL_FACTOR);.
20e90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20ea0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
20eb0 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63  se);      /* Tic
20ec0 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
20ed0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
20ee0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b  .        r1 = 0;
20ef0 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
20f00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
20f10 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
20f20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72  /* Possibly over
20f30 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
20f40 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  n if the first a
20f50 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  rgument is.     
20f60 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61   ** a virtual ta
20f70 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  ble column..    
20f80 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
20f90 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  r infix function
20fa0 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52  s (LIKE, GLOB, R
20fb0 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48  EGEXP, and MATCH
20fc0 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  ) use the.      
20fd0 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
20fe0 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73  nt, not the firs
20ff0 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  t, as the argume
21000 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20  nt to test to.  
21010 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
21020 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
21030 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
21040 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
21050 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
21060 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
21070 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69   of infix functi
21080 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64  ons (the operand
21090 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20   we want to.    
210a0 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65    ** control ove
210b0 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75  rloading) ends u
210c0 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  p as the second 
210d0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
210e0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
210f0 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  n.  The expressi
21100 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73  on "A glob B" is
21110 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
21120 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42        ** "glob(B
21130 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f  ,A).  We want to
21140 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41   use the A in "A
21150 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74   glob B" to test
21160 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75  .      ** for fu
21170 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
21180 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20  ng.  But we use 
21190 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67  the B term in "g
211a0 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20  lob(B,A)"..     
211b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46   */.      if( nF
211c0 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72  arg>=2 && (pExpr
211d0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66  ->flags & EP_Inf
211e0 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  ixFunc) ){.     
211f0 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
21200 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
21210 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
21220 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
21230 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
21240 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67   }else if( nFarg
21250 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
21260 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
21270 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
21280 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
21290 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
212a0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  xpr);.      }.#e
212b0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
212c0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
212d0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
212e0 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
212f0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
21300 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
21310 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
21320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21330 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
21340 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
21350 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
21360 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
21370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21380 4f 70 34 28 76 2c 20 70 50 61 72 73 65 2d 3e 69  Op4(v, pParse->i
21390 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50 75 72  SelfTab ? OP_Pur
213a0 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75 6e 63  eFunc0 : OP_Func
213b0 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20 20 20  tion0,.         
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
213d0 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61  onstMask, r1, ta
213e0 72 67 65 74 2c 20 28 63 68 61 72 2a 29 70 44 65  rget, (char*)pDe
213f0 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  f, P4_FUNCDEF);.
21400 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21410 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
21420 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69  )nFarg);.      i
21430 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73  f( nFarg && cons
21440 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  tMask==0 ){.    
21450 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
21460 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
21470 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a  se, r1, nFarg);.
21480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
21490 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
214a0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
214b0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
214c0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
214d0 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
214e0 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
214f0 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
21500 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
21510 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
21520 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
21530 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
21540 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
21550 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70  ECT && (nCol = p
21560 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
21570 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21  >pEList->nExpr)!
21580 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
21590 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
215a0 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  ror(pParse, nCol
215b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
215c0 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
215d0 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  n sqlite3CodeSub
215e0 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
215f0 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Expr, 0, 0);.   
21600 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
21610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
21620 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
21630 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  N: {.      int n
21640 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
21650 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65  r->pLeft->iTable
21660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
21670 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61  Expr->pLeft->iTa
21680 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ble = sqlite3Cod
21690 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
216a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
216b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
216c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
216d0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
216e0 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  | pExpr->pLeft->
216f0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
21700 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
21710 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
21720 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
21730 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  !=(n = sqlite3Ex
21740 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
21750 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20  pr->pLeft)) .   
21760 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
21770 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21780 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e  arse, "%d column
21790 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61  s assigned %d va
217a0 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lues",.         
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
217d0 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  able, n);.      
217e0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
217f0 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61  Expr->pLeft->iTa
21800 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f  ble + pExpr->iCo
21810 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lumn;.    }.    
21820 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
21830 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
21840 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
21850 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
21860 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
21870 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
21880 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
21890 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
218a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
218b0 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
218c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
218d0 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
218e0 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
218f0 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
21900 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21910 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
21920 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
21930 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21940 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
21950 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
21960 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21970 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21980 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
21990 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
219a0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
219b0 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
219c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
219d0 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
219e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
219f0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
21a00 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
21a10 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
21a20 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  D z.    **.    *
21a30 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  * This is equiva
21a40 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20  lent to.    **. 
21a50 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
21a60 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20  D x<=z.    **.  
21a70 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64    ** X is stored
21a80 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
21a90 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74  ..    ** Y is st
21aa0 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
21ab0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
21ac0 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74  ..    ** Z is st
21ad0 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
21ae0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
21af0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
21b00 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
21b10 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
21b20 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
21b30 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  xpr, target, 0, 
21b40 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
21b50 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
21b60 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a     case TK_SPAN:
21b70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
21b80 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20  LATE: .    case 
21b90 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
21ba0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
21bb0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
21bc0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
21bd0 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
21be0 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
21bf0 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20  _TRIGGER: {.    
21c00 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f    /* If the opco
21c10 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52  de is TK_TRIGGER
21c20 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
21c30 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72  ssion is a refer
21c40 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ence.      ** to
21c50 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
21c60 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
21c70 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76  pseudo-tables av
21c80 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  ailable to.     
21c90 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
21ca0 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  rams. In this ca
21cb0 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69  se Expr.iTable i
21cc0 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74  s set to 1 for t
21cd0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  he.      ** new.
21ce0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
21cf0 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64  or 0 for the old
21d00 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
21d10 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20   Expr.iColumn.  
21d20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
21d30 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   the column of t
21d40 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  he pseudo-table 
21d50 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d  to read, or to -
21d60 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  1 to.      ** re
21d70 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  ad the rowid fie
21d80 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ld..      **.   
21d90 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73     ** The expres
21da0 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  sion is implemen
21db0 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f  ted using an OP_
21dc0 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68  Param opcode. Th
21dd0 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61  e p1.      ** pa
21de0 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74  rameter is set t
21df0 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72  o 0 for an old.r
21e00 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
21e10 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20  or to (i+1).    
21e20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63    ** to referenc
21e30 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  e another column
21e40 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73   of the old.* ps
21e50 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72  eudo-table, wher
21e60 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73  e .      ** i is
21e70 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
21e80 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20  e column. For a 
21e90 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65  new.rowid refere
21ea0 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20  nce, p1 is.     
21eb0 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29   ** set to (n+1)
21ec0 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65  , where n is the
21ed0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
21ee0 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64  ns in each pseud
21ef0 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  o-table..      *
21f00 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63  * For a referenc
21f10 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63  e to any other c
21f20 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
21f30 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
21f40 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20   p1.      ** is 
21f50 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20  set to (n+2+i), 
21f60 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72  where n and i ar
21f70 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65  e as defined pre
21f80 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20  viously. For.   
21f90 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69     ** example, i
21fa0 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77  f the table on w
21fb0 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72  hich triggers ar
21fc0 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73  e being fired is
21fd0 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72  .      ** declar
21fe0 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
21ff0 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
22000 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
22010 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ;.      **.     
22020 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69   ** Then p1 is i
22030 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
22040 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  llows:.      **.
22050 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30        **   p1==0
22060 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77     ->    old.row
22070 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d  id     p1==3   -
22080 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20  >    new.rowid. 
22090 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20       **   p1==1 
220a0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20    ->    old.a   
220b0 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e        p1==4   ->
220c0 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20      new.a.      
220d0 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20  **   p1==2   -> 
220e0 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20     old.b        
220f0 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e   p1==5   ->    n
22100 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20  ew.b       .    
22110 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
22120 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e   *pTab = pExpr->
22130 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
22140 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  p1 = pExpr->iTab
22150 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c  le * (pTab->nCol
22160 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d  +1) + 1 + pExpr-
22170 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20  >iColumn;..     
22180 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
22190 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
221a0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  pr->iTable==1 );
221b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
221c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d  Expr->iColumn>=-
221d0 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  1 && pExpr->iCol
221e0 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  umn<pTab->nCol )
221f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22200 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c  pTab->iPKey<0 ||
22210 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
22220 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a  =pTab->iPKey );.
22230 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
22240 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d  >=0 && p1<(pTab-
22250 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20  >nCol*2+2) );.. 
22260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22270 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72  AddOp2(v, OP_Par
22280 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b  am, p1, target);
22290 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
222a0 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e  nt((v, "%s.%s ->
222b0 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28   $%d",.        (
222c0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
222d0 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a  "new" : "old"),.
222e0 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
222f0 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77  iColumn<0 ? "row
22300 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61  id" : pExpr->pTa
22310 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
22320 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a  Column].zName),.
22330 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20          target. 
22340 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65       ));..#ifnde
22350 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
22360 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
22370 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
22380 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66  umn has REAL aff
22390 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75  inity, it may cu
223a0 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
223b0 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a  d as an.      **
223c0 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50   integer. Use OP
223d0 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f  _RealAffinity to
223e0 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
223f0 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20   really real..  
22400 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
22410 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
22420 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74  0985-57662 SQLit
22430 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  e will convert t
22440 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f  he value back to
22450 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  .      ** floati
22460 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78  ng point when ex
22470 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d  tracting it from
22480 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f   the record.  */
22490 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
224a0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20  ->iColumn>=0 .  
224b0 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43       && pTab->aC
224c0 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
224d0 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  n].affinity==SQL
224e0 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20  ITE_AFF_REAL.   
224f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
22500 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
22510 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  v, OP_RealAffini
22520 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ty, target);.   
22530 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
22540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
22550 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54      case TK_VECT
22560 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OR: {.      sqli
22570 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22580 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
22590 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20  isused");.      
225a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
225b0 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c    case TK_IF_NUL
225c0 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69  L_ROW: {.      i
225d0 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20  nt addrINR;.    
225e0 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69    addrINR = sqli
225f0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
22600 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70   OP_IfNullRow, p
22610 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
22620 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22630 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
22640 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
22650 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22660 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
22670 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
22680 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
22690 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
226a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
226b0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
226c0 72 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a  re(v, addrINR);.
226d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
226e0 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
226f0 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20  rINR, inReg);.  
22700 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22710 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
22720 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20  Form A:.    **  
22730 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20   CASE x WHEN e1 
22740 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
22750 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
22760 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
22770 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
22780 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20    ** Form B:.   
22790 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
227a0 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
227b0 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
227c0 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
227d0 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
227e0 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69  .    ** Form A i
227f0 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f  s can be transfo
22800 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71  rmed into the eq
22810 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20  uivalent form B 
22820 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
22830 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78  **   CASE WHEN x
22840 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =e1 THEN r1 WHEN
22850 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e   x=e2 THEN r2 ..
22860 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
22870 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72  WHEN x=eN THEN r
22880 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
22890 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66   **.    ** X (if
228a0 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
228b0 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
228c0 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74      ** Y is in t
228d0 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20  he last element 
228e0 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  of pExpr->x.pLis
228f0 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t if pExpr->x.pL
22900 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20  ist->nExpr is.  
22910 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59    ** odd.  The Y
22920 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61   is also optiona
22930 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65  l.  If the numbe
22940 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
22950 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20   x.pList.    ** 
22960 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20  is even, then Y 
22970 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74  is omitted and t
22980 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72  he "otherwise" r
22990 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20  esult is NULL.. 
229a0 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70     ** Ei is in p
229b0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
229c0 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45  *2] and Ri is pE
229d0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
229e0 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  2+1]..    **.   
229f0 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   ** The result o
22a00 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
22a10 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74   is the Ri for t
22a20 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
22a30 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  g Ei,.    ** or 
22a40 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
22a50 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20  atching Ei, the 
22a60 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20  ELSE term Y, or 
22a70 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  if there is.    
22a80 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c  ** no ELSE term,
22a90 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
22aa0 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
22ab0 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29  t( op==TK_CASE )
22ac0 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e  ; {.      int en
22ad0 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  dLabel;         
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
22af0 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e  OTO label for en
22b00 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a  d of CASE stmt *
22b10 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74  /.      int next
22b20 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Case;           
22b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
22b40 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74  O label for next
22b50 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
22b60 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b80 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75          /* 2x nu
22b90 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72  mber of WHEN ter
22ba0 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ms */.      int 
22bb0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22bd0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
22be0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
22bf0 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
22c00 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
22c10 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
22c20 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
22c30 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c  xprList_item *aL
22c40 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72  istelem;  /* Arr
22c50 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  ay of WHEN terms
22c60 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f   */.      Expr o
22c70 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20  pCompare;       
22c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22c90 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73  he X==Ei express
22ca0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
22cb0 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22cd0 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69  * The X expressi
22ce0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
22cf0 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20   *pTest = 0;    
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22d10 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20   X==Ei (form A) 
22d20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d  or just Ei (form
22d30 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41   B) */.      VVA
22d40 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68  _ONLY( int iCach
22d50 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  eLevel = pParse-
22d60 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a  >iCacheLevel; ).
22d70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
22d80 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22d90 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
22da0 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78  ect) && pExpr->x
22db0 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  .pList );.      
22dc0 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e  assert(pExpr->x.
22dd0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
22de0 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
22df0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
22e00 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
22e10 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
22e20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
22e30 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
22e40 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c    endLabel = sql
22e50 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
22e60 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l(v);.      if( 
22e70 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  (pX = pExpr->pLe
22e80 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ft)!=0 ){.      
22e90 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20    tempX = *pX;. 
22ea0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22eb0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pX->op==TK_COLU
22ec0 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78  MN );.        ex
22ed0 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74 65  prToRegister(&te
22ee0 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63  mpX, exprCodeVec
22ef0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65 6d  tor(pParse, &tem
22f00 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  pX, &regFree1));
22f10 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22f20 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
22f30 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
22f40 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20  (&opCompare, 0, 
22f50 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65  sizeof(opCompare
22f60 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  ));.        opCo
22f70 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
22f80 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
22f90 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d  are.pLeft = &tem
22fa0 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73  pX;.        pTes
22fb0 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a  t = &opCompare;.
22fc0 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65          /* Ticke
22fd0 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66  t b351d95f9cd5ef
22fe0 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61  17e9d9dbae18f5ca
22ff0 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20  8611190001:.    
23000 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65      ** The value
23010 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67   in regFree1 mig
23020 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20  ht get SCopy-ed 
23030 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65  into the file re
23040 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  sult..        **
23050 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   So make sure th
23060 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20  at the regFree1 
23070 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20  register is not 
23080 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72  reused for other
23090 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70  .        ** purp
230a0 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c  oses and possibl
230b0 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  y overwritten.  
230c0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  */.        regFr
230d0 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ee1 = 0;.      }
230e0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
230f0 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32  i<nExpr-1; i=i+2
23100 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23110 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
23120 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
23130 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
23140 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
23150 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
23160 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
23170 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
23180 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
23190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
231a0 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
231b0 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
231c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
231d0 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
231e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
231f0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
23200 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
23210 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
23220 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23230 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
23240 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
23250 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
23260 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
23270 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
23280 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
23290 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
232a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
232b0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
232c0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
232d0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
232e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
232f0 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62  beGoto(v, endLab
23300 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
23310 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
23320 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
23330 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
23340 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
23350 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
23360 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72        if( (nExpr
23370 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
23380 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
23390 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
233a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
233b0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
233c0 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d  pEList->a[nExpr-
233d0 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
233e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
233f0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
23400 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65  Parse);.      }e
23410 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
23420 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23430 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
23440 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
23450 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
23460 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
23470 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
23480 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20  >nErr>0 .       
23490 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69      || pParse->i
234a0 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63  CacheLevel==iCac
234b0 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20  heLevel );.     
234c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
234d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c  lveLabel(v, endL
234e0 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  abel);.      bre
234f0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
23500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
23510 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
23520 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
23530 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
23540 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c  affinity==OE_Rol
23550 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20  lback .         
23560 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
23570 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20  nity==OE_Abort. 
23580 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
23590 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
235a0 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20  _Fail.          
235b0 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
235c0 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20  ity==OE_Ignore. 
235d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
235e0 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  ( !pParse->pTrig
235f0 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20  gerTab ){.      
23600 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23610 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23630 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
23640 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
23650 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
23660 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
23670 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
23680 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
23690 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41  ->affinity==OE_A
236a0 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
236b0 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
236c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
236d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
236e0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
236f0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
23700 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ue) );.      if(
23710 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
23720 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  ==OE_Ignore ){. 
23730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23740 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
23750 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74        v, OP_Halt
23760 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f  , SQLITE_OK, OE_
23770 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72  Ignore, 0, pExpr
23780 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20  ->u.zToken,0);. 
23790 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
237a0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65  age(v);.      }e
237b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
237c0 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
237d0 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  nt(pParse, SQLIT
237e0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
237f0 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  GGER,.          
23800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23810 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
23820 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ity, pExpr->u.zT
23830 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  oken, 0, 0);.   
23840 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61     }..      brea
23850 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
23860 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
23870 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
23880 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
23890 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
238a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
238b0 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75  egFree2);.  retu
238c0 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
238d0 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68  ** Factor out th
238e0 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69  e code of the gi
238f0 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ven expression t
23900 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
23910 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   time..**.** If 
23920 72 65 67 44 65 73 74 3e 3d 30 20 74 68 65 6e 20  regDest>=0 then 
23930 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  the result is al
23940 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ways stored in t
23950 68 61 74 20 72 65 67 69 73 74 65 72 20 61 6e 64  hat register and
23960 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69   the.** result i
23970 73 20 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e 20  s not reusable. 
23980 20 49 66 20 72 65 67 44 65 73 74 3c 30 20 74 68   If regDest<0 th
23990 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
239a0 69 73 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73  is free to .** s
239b0 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 77  tore the value w
239c0 68 65 72 65 65 76 65 72 20 69 74 20 77 61 6e 74  hereever it want
239d0 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  s.  The register
239e0 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65   where the expre
239f0 73 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f  ssion .** is sto
23a00 72 65 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e  red is returned.
23a10 20 20 57 68 65 6e 20 72 65 67 44 65 73 74 3c 30    When regDest<0
23a20 2c 20 74 77 6f 20 69 64 65 6e 74 69 63 61 6c 20  , two identical 
23a30 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c  expressions will
23a40 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68 65 20  .** code to the 
23a50 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  same register..*
23a60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
23a70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50  rCodeAtInit(.  P
23a80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
23a90 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
23aa0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
23ab0 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
23ac0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
23ad0 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56 44  code when the VD
23ae0 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a  BE initializes *
23af0 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74 20  /.  int regDest 
23b00 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
23b10 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73  he value in this
23b20 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
23b30 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20    ExprList *p;. 
23b40 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61   assert( ConstFa
23b50 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
23b60 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
23b70 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69 66  pConstExpr;.  if
23b80 28 20 72 65 67 44 65 73 74 3c 30 20 26 26 20 70  ( regDest<0 && p
23b90 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
23ba0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
23bb0 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  tem;.    int i;.
23bc0 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d      for(pItem=p-
23bd0 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20  >a, i=p->nExpr; 
23be0 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d  i>0; pItem++, i-
23bf0 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  -){.      if( pI
23c00 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26  tem->reusable &&
23c10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
23c20 61 72 65 28 30 2c 70 49 74 65 6d 2d 3e 70 45 78  are(0,pItem->pEx
23c30 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20  pr,pExpr,-1)==0 
23c40 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
23c50 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73  n pItem->u.iCons
23c60 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20  tExprReg;.      
23c70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  }.    }.  }.  pE
23c80 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
23c90 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
23ca0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20   pExpr, 0);.  p 
23cb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
23cc0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
23cd0 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  p, pExpr);.  if(
23ce0 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63   p ){.     struc
23cf0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
23d00 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
23d10 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
23d20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
23d30 20 3d 20 72 65 67 44 65 73 74 3c 30 3b 0a 20 20   = regDest<0;.  
23d40 20 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30     if( regDest<0
23d50 20 29 20 72 65 67 44 65 73 74 20 3d 20 2b 2b 70   ) regDest = ++p
23d60 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
23d70 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73    pItem->u.iCons
23d80 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65  tExprReg = regDe
23d90 73 74 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  st;.  }.  pParse
23da0 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70  ->pConstExpr = p
23db0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 44 65  ;.  return regDe
23dc0 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  st;.}../*.** Gen
23dd0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
23de0 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
23df0 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  sion and store t
23e00 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
23e10 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  to a register.  
23e20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
23e30 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
23e40 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
23e50 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
23e60 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65  * If the registe
23e70 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
23e80 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
23e90 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65  an be deallocate
23ea0 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  d,.** then write
23eb0 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f   its number into
23ec0 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20   *pReg.  If the 
23ed0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
23ee0 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70  is not.** a temp
23ef0 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20  orary, then set 
23f00 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pReg to zero..*
23f10 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
23f20 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65   a constant, the
23f30 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
23f40 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68  ight generate th
23f50 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69  is.** code to fi
23f60 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ll the register 
23f70 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  in the initializ
23f80 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66  ation section of
23f90 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
23fa0 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74  gram, in order t
23fb0 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20  o factor it out 
23fc0 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  of the evaluatio
23fd0 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  n loop..*/.int s
23fe0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
23ff0 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mp(Parse *pParse
24000 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
24010 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74  nt *pReg){.  int
24020 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   r2;.  pExpr = s
24030 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
24040 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
24050 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  if( ConstFactorO
24060 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20  k(pParse).   && 
24070 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
24080 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c  GISTER.   && sql
24090 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
240a0 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29  ntNotJoin(pExpr)
240b0 0a 20 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20  .  ){.    *pReg 
240c0 20 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d 20 73   = 0;.    r2 = s
240d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
240e0 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
240f0 70 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  pr, -1);.  }else
24100 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73  {.    int r1 = s
24110 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
24120 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32  (pParse);.    r2
24130 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24140 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
24150 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
24160 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
24170 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b       *pReg = r1;
24180 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24190 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
241a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
241b0 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67  r1);.      *pReg
241c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
241d0 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a    return r2;.}..
241e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
241f0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
24200 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
24210 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
24220 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
24230 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
24240 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
24250 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
24260 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
24270 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
24280 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24290 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
242a0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
242b0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
242c0 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  ){.  int inReg;.
242d0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
242e0 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
242f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
24300 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45   if( pExpr && pE
24310 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
24320 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69  STER ){.    sqli
24330 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
24340 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
24350 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61  Copy, pExpr->iTa
24360 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ble, target);.  
24370 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67  }else{.    inReg
24380 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24390 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
243a0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
243b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
243c0 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c  rse->pVdbe!=0 ||
243d0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
243e0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
243f0 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
24400 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56  et && pParse->pV
24410 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  dbe ){.      sql
24420 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
24430 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
24440 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
24450 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arget);.    }.  
24460 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
24470 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79  a transient copy
24480 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
24490 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f  Expr and then co
244a0 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73  de it using.** s
244b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
244c0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
244d0 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
244e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
244f0 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74  ).** except that
24500 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65   the input expre
24510 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74  ssion is guarant
24520 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e  eed to be unchan
24530 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ged..*/.void sql
24540 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
24550 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24560 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
24570 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69   target){.  sqli
24580 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
24590 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  ->db;.  pExpr = 
245a0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
245b0 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
245c0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
245d0 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45  ailed ) sqlite3E
245e0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
245f0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
24600 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
24610 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
24620 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
24630 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
24640 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
24650 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
24660 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
24670 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
24680 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
24690 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
246a0 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
246b0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
246c0 67 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70  get.  If the exp
246d0 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
246e0 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
246f0 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
24700 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74  choose to code t
24710 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  he expression at
24720 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
24730 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
24740 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63  lite3ExprCodeFac
24750 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70  torable(Parse *p
24760 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
24770 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
24780 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f  .  if( pParse->o
24790 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20  kConstFactor && 
247a0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
247b0 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
247c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
247d0 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
247e0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
247f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
24800 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
24810 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
24820 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rget);.  }.}../*
24830 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
24840 65 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73  e that evaluates
24850 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
24860 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74  ssion and puts t
24870 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  he result.** in 
24880 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
24890 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65  .**.** Also make
248a0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
248b0 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74  xpression result
248c0 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22  s into another "
248d0 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a  cache" register.
248e0 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68  ** and modify th
248f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20  e expression so 
24900 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69  that the next ti
24910 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  me it is evaluat
24920 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  ed,.** the resul
24930 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  t is a copy of t
24940 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65  he cache registe
24950 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
24960 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
24970 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  r expressions th
24980 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74  at are used mult
24990 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20  iple .** times. 
249a0 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61   They are evalua
249b0 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65  ted once and the
249c0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
249d0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72  expression.** ar
249e0 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69  e reused..*/.voi
249f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
24a00 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20  eAndCache(Parse 
24a10 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
24a20 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
24a30 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
24a40 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
24a50 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73  int iMem;..  ass
24a60 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
24a70 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
24a80 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
24a90 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  R );.  sqlite3Ex
24aa0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
24ab0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
24ac0 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
24ad0 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
24ae0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
24af0 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20  P_Copy, target, 
24b00 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52  iMem);.  exprToR
24b10 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69  egister(pExpr, i
24b20 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mem);.}../*.** G
24b30 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
24b40 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
24b50 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
24b60 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
24b70 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
24b80 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65  ist into a seque
24b90 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
24ba0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61   beginning at ta
24bb0 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  rget..**.** Retu
24bc0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
24bd0 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61   elements evalua
24be0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ted..**.** The S
24bf0 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66  QLITE_ECEL_DUP f
24c00 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65  lag prevents the
24c10 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20   arguments from 
24c20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20  being.** filled 
24c30 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20  using OP_SCopy. 
24c40 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65   OP_Copy must be
24c50 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
24c60 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
24c70 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75  ECEL_FACTOR argu
24c80 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73  ment allows cons
24c90 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74  tant arguments t
24ca0 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64  o be.** factored
24cb0 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61   out into initia
24cc0 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a  lization code..*
24cd0 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
24ce0 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65  ECEL_REF flag me
24cf0 61 6e 73 20 74 68 61 74 20 65 78 70 72 65 73 73  ans that express
24d00 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ions in the list
24d10 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73   with.** ExprLis
24d20 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  t.a[].u.x.iOrder
24d30 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72  ByCol>0 have alr
24d40 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61  eady been evalua
24d50 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a  ted and stored.*
24d60 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 61  * in registers a
24d70 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f  t srcReg, and so
24d80 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62   the value can b
24d90 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68  e copied from th
24da0 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ere..*/.int sqli
24db0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
24dc0 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
24dd0 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
24de0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
24df0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
24e00 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  t,   /* The expr
24e10 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62  ession list to b
24e20 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e coded */.  int
24e30 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20   target,        
24e40 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
24e50 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
24e60 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20  nt srcReg,      
24e70 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69    /* Source regi
24e80 73 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f  sters if SQLITE_
24e90 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38  ECEL_REF */.  u8
24ea0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
24eb0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   /* SQLITE_ECEL_
24ec0 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
24ed0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
24ee0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
24ef0 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38  nt i, j, n;.  u8
24f00 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73   copyOp = (flags
24f10 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44   & SQLITE_ECEL_D
24f20 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20  UP) ? OP_Copy : 
24f30 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65  OP_SCopy;.  Vdbe
24f40 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
24f50 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dbe;.  assert( p
24f60 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
24f70 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
24f80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
24f90 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20  e->pVdbe!=0 );  
24fa0 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68  /* Never gets th
24fb0 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65  is far otherwise
24fc0 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d   */.  n = pList-
24fd0 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43  >nExpr;.  if( !C
24fe0 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
24ff0 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20  rse) ) flags &= 
25000 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  ~SQLITE_ECEL_FAC
25010 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  TOR;.  for(pItem
25020 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
25030 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
25040 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
25050 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
25060 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61  pr;.    if( (fla
25070 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
25080 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d  _REF)!=0 && (j =
25090 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
250a0 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20  erByCol)>0 ){.  
250b0 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
250c0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
250d0 52 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69  REF ){.        i
250e0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b  --;.        n--;
250f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25100 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25110 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f  eAddOp2(v, copyO
25120 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74  p, j+srcReg-1, t
25130 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
25140 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
25150 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
25160 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20  ECEL_FACTOR)!=0 
25170 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
25180 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20  Constant(pExpr) 
25190 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
251a0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
251b0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
251c0 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c  rget+i);.    }el
251d0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e  se{.      int in
251e0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
251f0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
25200 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
25210 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t+i);.      if( 
25220 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20  inReg!=target+i 
25230 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f  ){.        VdbeO
25240 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20  p *pOp;.        
25250 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43  if( copyOp==OP_C
25260 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
25270 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65  (pOp=sqlite3Vdbe
25280 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f  GetOp(v, -1))->o
25290 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20  pcode==OP_Copy. 
252a0 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
252b0 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e  p1+pOp->p3+1==in
252c0 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
252d0 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b  pOp->p2+pOp->p3+
252e0 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20  1==target+i.    
252f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
25300 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20   pOp->p3++;.    
25310 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25320 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25330 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
25340 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b  , inReg, target+
25350 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
25360 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25370 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
25380 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
25390 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e  de for a BETWEEN
253a0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
253b0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
253c0 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  AND z.**.** The 
253d0 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c  above is equival
253e0 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20  ent to .**.**   
253f0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a   x>=y AND x<=z.*
25400 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20  *.** Code it as 
25410 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
25420 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
25430 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
25440 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20  .** elimination 
25450 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  of x..**.** The 
25460 78 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65  xJumpIf paramete
25470 72 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74  r determines det
25480 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  ails:.**.**    N
25490 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20  ULL:            
254a0 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65         Store the
254b0 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
254c0 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20  in reg[dest].** 
254d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
254e0 54 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20  True:      Jump 
254f0 74 6f 20 64 65 73 74 20 69 66 20 74 72 75 65 0a  to dest if true.
25500 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  **    sqlite3Exp
25510 72 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75  rIfFalse:     Ju
25520 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20 66 61  mp to dest if fa
25530 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75  lse.**.** The ju
25540 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74  mpIfNull paramet
25550 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
25560 20 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c   xJumpIf is NULL
25570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25580 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
25590 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
255a0 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
255b0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
255c0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
255d0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
255e0 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45      /* The BETWE
255f0 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  EN expression */
25600 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
25610 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
25620 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72  tination or stor
25630 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  age location */.
25640 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28    void (*xJump)(
25650 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74  Parse*,Expr*,int
25660 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e  ,int), /* Action
25670 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e   to take */.  in
25680 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20  t jumpIfNull    
25690 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70  /* Take the jump
256a0 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
256b0 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45  is NULL */.){. E
256c0 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20  xpr exprAnd;    
256d0 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72   /* The AND oper
256e0 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e  ator in  x>=y AN
256f0 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70  D x<=z  */.  Exp
25700 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f  r compLeft;    /
25710 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72  * The  x>=y  ter
25720 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70  m */.  Expr comp
25730 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20  Right;   /* The 
25740 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20   x<=z  term */. 
25750 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20   Expr exprX;    
25760 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75     /* The  x  su
25770 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
25780 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
25790 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  0; /* Temporary 
257a0 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
257b0 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70  ..  memset(&comp
257c0 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Left, 0, sizeof(
257d0 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Expr));.  memset
257e0 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20  (&compRight, 0, 
257f0 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
25800 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64   memset(&exprAnd
25810 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
25820 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  ));..  assert( !
25830 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
25840 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
25850 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20  ect) );.  exprX 
25860 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
25870 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20  .  exprAnd.op = 
25880 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e  TK_AND;.  exprAn
25890 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
258a0 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  eft;.  exprAnd.p
258b0 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
258c0 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f  ht;.  compLeft.o
258d0 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d  p = TK_GE;.  com
258e0 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
258f0 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  xprX;.  compLeft
25900 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
25910 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
25920 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68  Expr;.  compRigh
25930 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20  t.op = TK_LE;.  
25940 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
25950 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70  = &exprX;.  comp
25960 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
25970 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
25980 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70  [1].pExpr;.  exp
25990 72 54 6f 52 65 67 69 73 74 65 72 28 26 65 78 70  rToRegister(&exp
259a0 72 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74  rX, exprCodeVect
259b0 6f 72 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  or(pParse, &expr
259c0 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a  X, &regFree1));.
259d0 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20    if( xJump ){. 
259e0 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c     xJump(pParse,
259f0 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
25a00 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
25a10 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
25a20 72 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  rk the expressio
25a30 6e 20 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20  n is being from 
25a40 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
25a50 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
25a60 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  .    ** so that 
25a70 74 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  the sqlite3ExprC
25a80 6f 64 65 54 61 72 67 65 74 28 29 20 72 6f 75 74  odeTarget() rout
25a90 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74  ine will not att
25aa0 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20  empt to move.   
25ab0 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20   ** it into the 
25ac0 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72  Parse.pConstExpr
25ad0 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c   list.  We shoul
25ae0 64 20 75 73 65 20 61 20 6e 65 77 20 62 69 74 20  d use a new bit 
25af0 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a  for this,.    **
25b00 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75   for clarity, bu
25b10 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20  t we are out of 
25b20 62 69 74 73 20 69 6e 20 74 68 65 20 45 78 70 72  bits in the Expr
25b30 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20  .flags field so 
25b40 77 65 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 74  we.    ** have t
25b50 6f 20 72 65 75 73 65 20 74 68 65 20 45 50 5f 46  o reuse the EP_F
25b60 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75  romJoin bit.  Bu
25b70 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70  mmer. */.    exp
25b80 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46  rX.flags |= EP_F
25b90 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c  romJoin;.    sql
25ba0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
25bb0 65 74 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  et(pParse, &expr
25bc0 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a  And, dest);.  }.
25bd0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
25be0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
25bf0 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a  regFree1);..  /*
25c00 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65   Ensure adequate
25c10 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a   test coverage *
25c20 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  /.  testcase( xJ
25c30 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
25c40 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
25c50 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
25c60 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
25c70 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
25c80 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
25c90 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
25ca0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
25cb0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
25cc0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
25cd0 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
25ce0 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
25cf0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
25d00 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
25d10 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
25d20 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
25d30 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
25d40 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
25d50 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
25d60 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
25d70 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
25d80 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
25d90 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
25da0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
25db0 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
25dc0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
25dd0 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
25de0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
25df0 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
25e00 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
25e10 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
25e20 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
25e30 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
25e40 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
25e50 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
25e60 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
25e70 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29  case( xJump==0 )
25e80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
25e90 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
25ea0 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
25eb0 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
25ec0 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
25ed0 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
25ee0 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
25ef0 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20  ion is true but 
25f00 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
25f10 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
25f20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
25f30 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e  ession is false.
25f40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
25f50 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
25f60 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
25f70 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
25f80 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b  se), then.** tak
25f90 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
25fa0 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61  e jumpIfNull fla
25fb0 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  g is SQLITE_JUMP
25fc0 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  IFNULL..**.** Th
25fd0 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
25fe0 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
25ff0 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76   certain token v
26000 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51  alues (ex: TK_EQ
26010 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  ).** are the sam
26020 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75  e as opcode valu
26030 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74  es (ex: OP_Eq) t
26040 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  hat implement th
26050 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
26060 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ** operation.  S
26070 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20  pecial comments 
26080 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68  in vdbe.c and th
26090 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
260a0 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65  script in.** the
260b0 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61   make process ca
260c0 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  use these values
260d0 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65   to align.  Asse
260e0 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64  rt()s in the cod
260f0 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66  e.** below verif
26100 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
26110 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63  rs are aligned c
26120 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69  orrectly..*/.voi
26130 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
26140 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
26150 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
26160 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
26170 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
26180 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
26190 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
261a0 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
261b0 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
261c0 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
261d0 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
261e0 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
261f0 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
26200 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
26210 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
26220 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72  ER(v==0) )     r
26230 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74  eturn;  /* Exist
26240 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
26250 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
26260 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  /.  if( NEVER(pE
26270 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  xpr==0) ) return
26280 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69  ;  /* No way thi
26290 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a  s can happen */.
262a0 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
262b0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
262c0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
262d0 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  D: {.      int d
262e0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
262f0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
26300 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26310 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26320 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26330 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
26340 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
26350 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
26360 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
26370 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26380 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
26390 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
263a0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
263b0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
263c0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
263d0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
263e0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
263f0 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
26400 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
26410 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
26420 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26430 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
26440 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
26450 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26460 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
26470 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
26480 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
26490 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
264a0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
264b0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
264c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
264d0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
264e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
264f0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
26500 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26510 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
26520 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
26530 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26540 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
26550 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
26560 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
26570 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
26580 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
26590 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
265a0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
265b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
265c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
265d0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
265e0 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
265f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
26600 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
26610 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
26620 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
26630 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
26640 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
26650 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75  ;.      jumpIfNu
26660 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ll = SQLITE_NULL
26670 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  EQ;.      /* Fal
26680 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61  l thru */.    ca
26690 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
266a0 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
266b0 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
266c0 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
266d0 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
266e0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
266f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
26700 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d  rIsVector(pExpr-
26710 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64  >pLeft) ) goto d
26720 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20  efault_expr;.   
26730 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26740 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26750 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
26760 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
26770 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26780 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
26790 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
267a0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
267b0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
267c0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
267d0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
267e0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
267f0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
26800 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
26810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
26820 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
26830 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
26840 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
26850 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
26860 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
26870 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
26880 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
26890 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
268a0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
268b0 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
268c0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
268d0 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
268e0 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
268f0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
26900 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
26910 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
26920 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26930 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
26940 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
26950 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
26960 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
26970 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
26980 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
26990 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
269a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
269b0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
269c0 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
269d0 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l==SQLITE_NULLEQ
269e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
269f0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
26a00 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
26a10 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
26a20 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Q);.      assert
26a30 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
26a40 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26a50 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Ne);.      VdbeC
26a60 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26a70 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
26a80 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
26a90 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
26aa0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
26ab0 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
26ac0 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
26ad0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
26ae0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
26af0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
26b00 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
26b10 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
26b20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
26b30 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
26b40 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
26b50 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
26b60 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
26b70 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
26b80 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
26b90 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
26ba0 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
26bb0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
26bc0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
26bd0 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
26be0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
26bf0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
26c00 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
26c10 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
26c20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26c30 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
26c40 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  st);.      VdbeC
26c50 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26c60 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
26c70 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
26c80 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
26c90 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
26ca0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
26cb0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
26cc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
26cd0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
26ce0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26cf0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26d00 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
26d10 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
26d20 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74  xpr, dest, sqlit
26d30 65 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a 75  e3ExprIfTrue, ju
26d40 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26d50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
26d60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26d70 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
26d80 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
26d90 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
26da0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
26db0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
26dc0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
26dd0 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
26de0 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
26df0 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
26e00 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
26e10 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
26e20 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
26e30 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
26e40 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
26e50 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
26e60 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
26e70 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61  abel(v, destIfFa
26e80 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lse);.      brea
26e90 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
26ea0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
26eb0 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a     default_expr:
26ec0 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41  .      if( exprA
26ed0 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
26ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26ef0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
26f00 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
26f10 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
26f20 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
26f30 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70          /* No-op
26f40 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
26f50 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
26f60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26f70 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
26f80 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
26f90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26fa0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c  AddOp3(v, OP_If,
26fb0 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
26fc0 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
26fd0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
26fe0 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
26ff0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
27000 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
27010 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27020 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  l==0 );.      }.
27030 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27040 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
27050 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
27060 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
27070 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
27080 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
27090 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d  , regFree2);  .}
270a0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
270b0 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
270c0 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
270d0 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
270e0 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
270f0 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
27100 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
27110 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
27120 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
27130 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
27140 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
27150 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
27160 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
27170 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
27180 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
27190 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
271a0 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
271b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53   jumpIfNull is S
271c0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
271d0 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
271e0 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a   if jumpIfNull.*
271f0 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  * is 0..*/.void 
27200 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27210 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
27220 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
27230 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
27240 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
27250 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
27260 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
27270 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
27280 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
27290 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
272a0 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
272b0 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
272c0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
272d0 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
272e0 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
272f0 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
27300 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f  ; /* Existence o
27310 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
27320 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
27330 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20  ( pExpr==0 )    
27340 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
27350 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
27360 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
27370 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
27380 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
27390 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
273a0 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
273b0 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
273c0 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
273d0 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
273e0 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
273f0 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
27400 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
27410 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
27420 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
27430 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
27440 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
27450 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
27460 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
27470 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
27480 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
27490 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
274a0 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
274b0 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
274c0 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
274d0 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
274e0 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
274f0 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
27500 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
27510 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
27520 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
27530 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
27540 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
27550 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
27560 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
27570 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
27580 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
27590 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
275a0 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
275b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
275c0 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
275d0 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
275e0 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
275f0 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
27600 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
27610 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
27620 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
27630 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
27640 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
27650 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
27660 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
27670 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
27680 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
27690 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
276a0 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
276b0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
276c0 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
276d0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
276e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
276f0 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
27700 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
27710 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27720 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
27730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27740 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
27750 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
27760 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27770 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
27780 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
27790 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
277a0 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
277b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
277c0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
277d0 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
277e0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
277f0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
27800 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
27810 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
27820 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
27830 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
27840 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
27850 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
27860 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27870 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
27880 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
27890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
278a0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
278b0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
278c0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
278d0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
278e0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
278f0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
27900 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
27910 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
27920 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
27930 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
27940 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
27950 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
27960 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
27970 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
27980 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
27990 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c  t, d2, jumpIfNul
279a0 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
279b0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
279c0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
279d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
279e0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
279f0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
27a00 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
27a10 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27a20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
27a30 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
27a40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27a50 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
27a60 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
27a70 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
27a80 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
27a90 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27aa0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27ab0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27ac0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
27ad0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
27ae0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
27af0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
27b00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
27b10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
27b20 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  OT:.      testca
27b30 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
27b40 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
27b50 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
27b60 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
27b70 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72       op = (pExpr
27b80 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54  ->op==TK_IS) ? T
27b90 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20  K_NE : TK_EQ;.  
27ba0 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d      jumpIfNull =
27bb0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a   SQLITE_NULLEQ;.
27bc0 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
27bd0 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
27be0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
27bf0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
27c00 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
27c10 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
27c20 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
27c30 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_EQ: {.      if
27c40 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
27c50 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65  ector(pExpr->pLe
27c60 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75  ft) ) goto defau
27c70 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74  lt_expr;.      t
27c80 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27c90 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27ca0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
27cb0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
27cc0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
27cd0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
27ce0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
27cf0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
27d00 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
27d10 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
27d20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
27d30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27d40 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
27d50 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
27d60 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
27d70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
27d80 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
27d90 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
27da0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
27db0 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
27dc0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
27dd0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27de0 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
27df0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
27e00 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
27e10 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
27e20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
27e30 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
27e40 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
27e50 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
27e60 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
27e70 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
27e80 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
27e90 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
27ea0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27eb0 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
27ec0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
27ed0 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
27ee0 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  e(op==OP_Eq);.  
27ef0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27f00 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
27f10 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
27f20 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
27f30 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27f40 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
27f50 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
27f60 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
27f70 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
27f80 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
27f90 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
27fa0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27fb0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
27fc0 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
27fd0 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
27fe0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27ff0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
28000 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
28010 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l==SQLITE_NULLEQ
28020 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28030 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
28040 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28050 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
28060 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
28070 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
28080 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
28090 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
280a0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
280b0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
280c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
280d0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
280e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
280f0 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
28100 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
28110 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
28120 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62  _ISNULL );   Vdb
28130 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
28140 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
28150 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
28160 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
28170 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
28180 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
28190 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
281a0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
281b0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
281c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
281d0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
281e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
281f0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
28200 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
28210 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
28220 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65  pr, dest, sqlite
28230 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20 6a 75  3ExprIfFalse, ju
28240 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
28250 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
28260 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28270 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
28280 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
28290 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c     if( jumpIfNul
282a0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
282b0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
282c0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
282d0 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  st, dest);.     
282e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
282f0 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
28300 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
28310 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
28320 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
28330 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
28340 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e  r, dest, destIfN
28350 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ull);.        sq
28360 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
28370 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e  Label(v, destIfN
28380 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
28390 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
283a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
283b0 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75  ult: {.    defau
283c0 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20 20 20  lt_expr: .      
283d0 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
283e0 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
283f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28400 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
28410 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
28420 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
28430 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
28440 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
28450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28460 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
28470 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
28480 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
28490 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
284a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
284b0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
284c0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
284d0 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56  l!=0);.        V
284e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
284f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
28500 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
28510 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
28520 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
28530 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
28540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
28550 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
28560 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
28570 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
28580 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
28590 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
285a0 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gFree2);.}../*.*
285b0 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  * Like sqlite3Ex
285c0 70 72 49 66 46 61 6c 73 65 28 29 20 65 78 63 65  prIfFalse() exce
285d0 70 74 20 74 68 61 74 20 61 20 63 6f 70 79 20 69  pt that a copy i
285e0 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70 72 20  s made of pExpr 
285f0 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67  before.** code g
28600 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74  eneration, and t
28610 68 61 74 20 63 6f 70 79 20 69 73 20 64 65 6c 65  hat copy is dele
28620 74 65 64 20 61 66 74 65 72 20 63 6f 64 65 20 67  ted after code g
28630 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a  eneration. This.
28640 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ** ensures that 
28650 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 45 78  the original pEx
28660 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  pr is unchanged.
28670 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
28680 45 78 70 72 49 66 46 61 6c 73 65 44 75 70 28 50  ExprIfFalseDup(P
28690 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
286a0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
286b0 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75  est,int jumpIfNu
286c0 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ll){.  sqlite3 *
286d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
286e0 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d  .  Expr *pCopy =
286f0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
28700 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
28710 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
28720 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
28730 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
28740 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f 70 79  se(pParse, pCopy
28750 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
28760 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
28770 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
28780 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pCopy);.}../*.*
28790 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 56 61  * Expression pVa
287a0 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
287b0 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 76 61 72  to be an SQL var
287c0 69 61 62 6c 65 2e 20 70 45 78 70 72 20 6d 61 79  iable. pExpr may
287d0 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70 65 20   be any.** type 
287e0 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  of expression..*
287f0 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
28800 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61   a simple SQL va
28810 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65 67 65 72  lue - an integer
28820 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 20  , real, string, 
28830 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20  blob.** or NULL 
28840 76 61 6c 75 65 20 2d 20 74 68 65 6e 20 74 68 65  value - then the
28850 20 56 44 42 45 20 63 75 72 72 65 6e 74 6c 79 20   VDBE currently 
28860 62 65 69 6e 67 20 70 72 65 70 61 72 65 64 20 69  being prepared i
28870 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20  s configured.** 
28880 74 6f 20 72 65 2d 70 72 65 70 61 72 65 20 65 61  to re-prepare ea
28890 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 76 61  ch time a new va
288a0 6c 75 65 20 69 73 20 62 6f 75 6e 64 20 74 6f 20  lue is bound to 
288b0 76 61 72 69 61 62 6c 65 20 70 56 61 72 2e 0a 2a  variable pVar..*
288c0 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  *.** Additionall
288d0 79 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 61  y, if pExpr is a
288e0 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75   simple SQL valu
288f0 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  e and the value 
28900 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  is the.** same a
28910 73 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  s that currently
28920 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62   bound to variab
28930 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a 65 72  le pVar, non-zer
28940 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
28950 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
28960 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 6e  the values are n
28970 6f 74 20 74 68 65 20 73 61 6d 65 20 6f 72 20 69  ot the same or i
28980 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61  f pExpr is not a
28990 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c 20 76   simple.** SQL v
289a0 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20 72 65  alue, zero is re
289b0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
289c0 63 20 69 6e 74 20 65 78 70 72 43 6f 6d 70 61 72  c int exprCompar
289d0 65 56 61 72 69 61 62 6c 65 28 50 61 72 73 65 20  eVariable(Parse 
289e0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
289f0 56 61 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Var, Expr *pExpr
28a00 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30  ){.  int res = 0
28a10 3b 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a 20 20  ;.  int iVar;.  
28a20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
28a30 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20 0a 20  L, *pR = 0;.  . 
28a40 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f   sqlite3ValueFro
28a50 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  mExpr(pParse->db
28a60 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f  , pExpr, SQLITE_
28a70 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41 46 46  UTF8, SQLITE_AFF
28a80 5f 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20 20 69  _BLOB, &pR);.  i
28a90 66 28 20 70 52 20 29 7b 0a 20 20 20 20 69 56 61  f( pR ){.    iVa
28aa0 72 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c 75 6d  r = pVar->iColum
28ab0 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
28ac0 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61  beSetVarmask(pPa
28ad0 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72  rse->pVdbe, iVar
28ae0 29 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71 6c 69  );.    pL = sqli
28af0 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
28b00 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65  alue(pParse->pRe
28b10 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20 53  prepare, iVar, S
28b20 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 29 3b  QLITE_AFF_BLOB);
28b30 0a 20 20 20 20 69 66 28 20 70 4c 20 29 7b 0a 20  .    if( pL ){. 
28b40 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
28b50 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4c 29 3d  _value_type(pL)=
28b60 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
28b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
28b80 76 61 6c 75 65 5f 74 65 78 74 28 70 4c 29 3b 20  value_text(pL); 
28b90 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
28ba0 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55 54 46   encoding is UTF
28bb0 2d 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  -8 */.      }.  
28bc0 20 20 20 20 72 65 73 20 3d 20 20 30 3d 3d 73 71      res =  0==sq
28bd0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
28be0 70 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20 20 20  pL, pR, 0);.    
28bf0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  }.    sqlite3Val
28c00 75 65 46 72 65 65 28 70 52 29 3b 0a 20 20 20 20  ueFree(pR);.    
28c10 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
28c20 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  (pL);.  }..  ret
28c30 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
28c40 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
28c50 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
28c60 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
28c70 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
28c80 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
28c90 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65  ons are complete
28ca0 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52  ly identical.  R
28cb0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20  eturn 1 if they 
28cc0 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62  differ only.** b
28cd0 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  y a COLLATE oper
28ce0 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20  ator at the top 
28cf0 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32  level.  Return 2
28d00 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69   if there are di
28d10 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68  fferences.** oth
28d20 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d  er than the top-
28d30 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70  level COLLATE op
28d40 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  erator..**.** If
28d50 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
28d60 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
28d70 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
28d80 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
28d90 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
28da0 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
28db0 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
28dc0 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
28dd0 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
28de0 54 68 65 20 70 41 20 73 69 64 65 20 6d 69 67 68  The pA side migh
28df0 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45  t be using TK_RE
28e00 47 49 53 54 45 52 2e 20 20 49 66 20 74 68 61 74  GISTER.  If that
28e10 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
28e20 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73   pB is.** not us
28e30 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20  ing TK_REGISTER 
28e40 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65  but is otherwise
28e50 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65   equivalent, the
28e60 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30  n still return 0
28e70 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  ..**.** Sometime
28e80 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
28e90 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65  ill return 2 eve
28ea0 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70  n if the two exp
28eb0 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c  ressions.** real
28ec0 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  ly are equivalen
28ed0 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74  t.  If we cannot
28ee0 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
28ef0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a  expressions are.
28f00 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65  ** identical, we
28f10 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74   return 2 just t
28f20 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69  o be safe.  So i
28f30 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
28f40 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65  * returns 2, the
28f50 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61  n you do not rea
28f60 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72  lly know for cer
28f70 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a  tain if the two.
28f80 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
28f90 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  re the same.  Bu
28fa0 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30  t if you get a 0
28fb0 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68   or 1 return, th
28fc0 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65  en you.** can be
28fd0 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73   sure the expres
28fe0 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
28ff0 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63  me.  In the plac
29000 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73  es where.** this
29010 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
29020 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75  , it does not hu
29030 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74  rt to get an ext
29040 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a  ra 2 - that.** j
29050 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ust might result
29060 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c   in some slightl
29070 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20  y slower code.  
29080 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  But returning.**
29090 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20   an incorrect 0 
290a0 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20  or 1 could lead 
290b0 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  to a malfunction
290c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73  ..**.** If pPars
290d0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  e is not NULL th
290e0 65 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 74  en TK_VARIABLE t
290f0 65 72 6d 73 20 69 6e 20 70 41 20 77 69 74 68 20  erms in pA with 
29100 62 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a 20 70  bindings in.** p
29110 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
29120 65 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64  e can be matched
29130 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72 61 6c   against literal
29140 73 20 69 6e 20 70 42 2e 20 20 54 68 65 20 0a 2a  s in pB.  The .*
29150 2a 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d  * pParse->pVdbe-
29160 3e 65 78 70 6d 61 73 6b 20 62 69 74 6d 61 73 6b  >expmask bitmask
29170 20 69 73 20 75 70 64 61 74 65 64 20 66 6f 72 20   is updated for 
29180 65 61 63 68 20 76 61 72 69 61 62 6c 65 20 72 65  each variable re
29190 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49 66 20  ferenced..** If 
291a0 70 50 61 72 73 65 20 69 73 20 4e 55 4c 4c 20 28  pParse is NULL (
291b0 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73 65 29  the normal case)
291c0 20 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56 41 52   then any TK_VAR
291d0 49 41 42 4c 45 20 74 65 72 6d 20 69 6e 20 0a 2a  IABLE term in .*
291e0 2a 20 41 72 67 75 6d 65 6e 74 20 70 50 61 72 73  * Argument pPars
291f0 65 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  e should normall
29200 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74  y be NULL. If it
29210 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64   is not NULL and
29220 20 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63 61 75   pA or.** pB cau
29230 73 65 73 20 61 20 72 65 74 75 72 6e 20 76 61 6c  ses a return val
29240 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e 74 20  ue of 2..*/.int 
29250 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
29260 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  re(Parse *pParse
29270 2c 20 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  , Expr *pA, Expr
29280 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
29290 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46  .  u32 combinedF
292a0 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d  lags;.  if( pA==
292b0 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20  0 || pB==0 ){.  
292c0 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20    return pB==pA 
292d0 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 69  ? 0 : 2;.  }.  i
292e0 66 28 20 70 50 61 72 73 65 20 26 26 20 70 41 2d  f( pParse && pA-
292f0 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45  >op==TK_VARIABLE
29300 20 26 26 20 65 78 70 72 43 6f 6d 70 61 72 65 56   && exprCompareV
29310 61 72 69 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ariable(pParse, 
29320 70 41 2c 20 70 42 29 20 29 7b 0a 20 20 20 20 72  pA, pB) ){.    r
29330 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63  eturn 0;.  }.  c
29340 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70  ombinedFlags = p
29350 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66  A->flags | pB->f
29360 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62  lags;.  if( comb
29370 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49  inedFlags & EP_I
29380 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
29390 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42  f( (pA->flags&pB
293a0 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61  ->flags&EP_IntVa
293b0 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75  lue)!=0 && pA->u
293c0 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69  .iValue==pB->u.i
293d0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72  Value ){.      r
293e0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
293f0 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
29400 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
29410 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  B->op ){.    if(
29420 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
29430 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
29440 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
29450 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42 2c 69  , pA->pLeft,pB,i
29460 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
29470 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
29480 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d      if( pB->op==
29490 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
294a0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
294b0 28 70 50 61 72 73 65 2c 20 70 41 2c 70 42 2d 3e  (pParse, pA,pB->
294c0 70 4c 65 66 74 2c 69 54 61 62 29 3c 32 20 29 7b  pLeft,iTab)<2 ){
294d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
294e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
294f0 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 2;.  }.  if( p
29500 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  A->op!=TK_COLUMN
29510 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41   && pA->op!=TK_A
29520 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  GG_COLUMN && pA-
29530 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
29540 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
29550 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
29560 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
29570 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  ICmp(pA->u.zToke
29580 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
29590 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  =0 ) return 2;. 
295a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
295b0 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e  cmp(pA->u.zToken
295c0 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d  ,pB->u.zToken)!=
295d0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
295e0 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  n pA->op==TK_COL
295f0 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20  LATE ? 1 : 2;.  
29600 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
29610 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  A->flags & EP_Di
29620 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c  stinct)!=(pB->fl
29630 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
29640 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  t) ) return 2;. 
29650 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d   if( ALWAYS((com
29660 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
29670 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29  TokenOnly)==0) )
29680 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e  {.    if( combin
29690 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73  edFlags & EP_xIs
296a0 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
296b0 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
296c0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
296d0 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c  arse, pA->pLeft,
296e0 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
296f0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
29700 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
29710 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
29720 20 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d   pA->pRight, pB-
29730 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
29740 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
29750 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
29760 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e  stCompare(pA->x.
29770 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69  pList, pB->x.pLi
29780 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  st, iTab) ) retu
29790 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 41 4c  rn 2;.    if( AL
297a0 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c  WAYS((combinedFl
297b0 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64  ags & EP_Reduced
297c0 29 3d 3d 30 29 20 26 26 20 70 41 2d 3e 6f 70 21  )==0) && pA->op!
297d0 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
297e0 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c      if( pA->iCol
297f0 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
29800 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
29810 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c     if( pA->iTabl
29820 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20  e!=pB->iTable . 
29830 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54        && (pA->iT
29840 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45  able!=iTab || NE
29850 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d  VER(pB->iTable>=
29860 30 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  0)) ) return 2;.
29870 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
29880 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
29890 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c  ompare two ExprL
298a0 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65  ist objects.  Re
298b0 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61  turn 0 if they a
298c0 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
298d0 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   .** non-zero if
298e0 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
298f0 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
29900 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
29910 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
29920 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
29930 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
29940 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
29950 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
29960 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
29970 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
29980 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
29990 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
299a0 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ght return non-z
299b0 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65  ero for equivale
299c0 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54  nt ExprLists.  T
299d0 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65  he.** only conse
299e0 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64  quence will be d
299f0 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61  isabled optimiza
29a00 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73  tions.  But this
29a10 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74   routine.** must
29a20 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20   never return 0 
29a30 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c  if the two ExprL
29a40 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ist objects are 
29a50 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a  different, or.**
29a60 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77   a malfunction w
29a70 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  ill result..**.*
29a80 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74  * Two NULL point
29a90 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ers are consider
29aa0 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d  ed to be the sam
29ab0 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70  e.  But a NULL p
29ac0 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73  ointer.** always
29ad0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20   differs from a 
29ae0 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  non-NULL pointer
29af0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29b00 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
29b10 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78  ExprList *pA, Ex
29b20 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20  prList *pB, int 
29b30 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iTab){.  int i;.
29b40 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70    if( pA==0 && p
29b50 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  B==0 ) return 0;
29b60 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
29b70 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pB==0 ) return 1
29b80 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70  ;.  if( pA->nExp
29b90 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72  r!=pB->nExpr ) r
29ba0 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69  eturn 1;.  for(i
29bb0 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b  =0; i<pA->nExpr;
29bc0 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
29bd0 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b  *pExprA = pA->a[
29be0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78  i].pExpr;.    Ex
29bf0 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d  pr *pExprB = pB-
29c00 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
29c10 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f   if( pA->a[i].so
29c20 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69  rtOrder!=pB->a[i
29c30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65  ].sortOrder ) re
29c40 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
29c50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
29c60 72 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45  re(0, pExprA, pE
29c70 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65  xprB, iTab) ) re
29c80 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
29c90 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
29ca0 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   Like sqlite3Exp
29cb0 72 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70  rCompare() excep
29cc0 74 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  t COLLATE operat
29cd0 6f 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c  ors at the top-l
29ce0 65 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f  evel.** are igno
29cf0 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
29d00 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b  te3ExprCompareSk
29d10 69 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  ip(Expr *pA, Exp
29d20 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  r *pB, int iTab)
29d30 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
29d40 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
29d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
29d60 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
29d70 6c 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20  late(pA),.      
29d80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
29d90 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42  prSkipCollate(pB
29da0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
29db0 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iTab);.}../*.** 
29dc0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77  Return true if w
29dd0 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20  e can prove the 
29de0 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  pE2 will always 
29df0 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69  be true if pE1 i
29e00 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75  s.** true.  Retu
29e10 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63  rn false if we c
29e20 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74  annot complete t
29e30 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70  he proof or if p
29e40 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66  E2 might.** be f
29e50 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a  alse.  Examples:
29e60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  .**.**     pE1: 
29e70 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20  x==5       pE2: 
29e80 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
29e90 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
29ea0 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20       pE1: x>0   
29eb0 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
29ec0 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
29ed0 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
29ee0 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20  pE1: x=21       
29ef0 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34  pE2: x=21 OR y=4
29f00 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  3     Result: tr
29f10 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
29f20 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78  !=123     pE2: x
29f30 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
29f40 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
29f50 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20      pE1: x!=?1  
29f60 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
29f70 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
29f80 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
29f90 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45  1: x IS NULL  pE
29fa0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
29fb0 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73      Result: fals
29fc0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
29fd0 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20  IS ?2    pE2: x 
29fe0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
29ff0 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a  euslt: false.**.
2a000 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e  ** When comparin
2a010 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  g TK_COLUMN node
2a020 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e  s between pE1 an
2a030 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61  d pE2, if pE2 ha
2a040 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65  s.** Expr.iTable
2a050 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61  <0 then assume a
2a060 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69   table number gi
2a070 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a  ven by iTab..**.
2a080 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
2a090 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
2a0a0 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75  he values of bou
2a0b0 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  nd variables in 
2a0c0 70 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70  pE1 are .** comp
2a0d0 61 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74  ared against lit
2a0e0 65 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70  eral values in p
2a0f0 45 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70  E2 and pParse->p
2a100 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73  Vdbe->expmask is
2a110 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20  .** modified to 
2a120 72 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75  record which bou
2a130 6e 64 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  nd variables are
2a140 20 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66   referenced.  If
2a150 20 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e   pParse .** is N
2a160 55 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20  ULL, then false 
2a170 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2a180 20 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73   if pE1 contains
2a190 20 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61   any bound varia
2a1a0 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  bles..**.** When
2a1b0 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72   in doubt, retur
2a1c0 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e  n false.  Return
2a1d0 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67  ing true might g
2a1e0 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
2a1f0 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74  e.** improvement
2a200 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c  .  Returning fal
2a210 73 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61  se might cause a
2a220 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
2a230 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69  uction, but.** i
2a240 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69  t will always gi
2a250 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  ve the correct a
2a260 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e  nswer and is hen
2a270 63 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a  ce always safe..
2a280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2a290 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61  prImpliesExpr(Pa
2a2a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2a2b0 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45  r *pE1, Expr *pE
2a2c0 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  2, int iTab){.  
2a2d0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2a2e0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2a2f0 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d  E1, pE2, iTab)==
2a300 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2a310 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
2a320 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26  ->op==TK_OR.   &
2a330 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d  & (sqlite3ExprIm
2a340 70 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65  pliesExpr(pParse
2a350 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66  , pE1, pE2->pLef
2a360 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20  t, iTab).       
2a370 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2a380 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
2a390 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2a3a0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
2a3b0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2a3c0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
2a3d0 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  E2->op==TK_NOTNU
2a3e0 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54  LL && pE1->op!=T
2a3f0 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d  K_ISNULL && pE1-
2a400 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20  >op!=TK_IS ){.  
2a410 20 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c    Expr *pX = sql
2a420 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2a430 61 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b  ate(pE1->pLeft);
2a440 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
2a450 58 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b  X!=pE1->pLeft );
2a460 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2a470 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2a480 73 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65  se, pX, pE2->pLe
2a490 66 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72  ft, iTab)==0 ) r
2a4a0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
2a4b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2a4c0 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2a4d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2a4e0 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
2a4f0 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c   by the tree wal
2a500 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ker.** to determ
2a510 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65 73  ine if an expres
2a520 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c  sion can be eval
2a530 75 61 74 65 64 20 62 79 20 72 65 66 65 72 65 6e  uated by referen
2a540 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64  ce to the.** ind
2a550 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74  ex only, without
2a560 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20   having to do a 
2a570 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 63  search for the c
2a580 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
2a590 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68  table entry.  Th
2a5a0 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20  e IdxCover.pIdx 
2a5b0 66 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64  field is the ind
2a5c0 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43  ex.  IdxCover.iC
2a5d0 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72  ur.** is the cur
2a5e0 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
2a5f0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78  e..*/.struct Idx
2a600 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20  Cover {.  Index 
2a610 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68  *pIdx;     /* Th
2a620 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65  e index to be te
2a630 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  sted for coverag
2a640 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  e */.  int iCur;
2a650 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
2a660 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
2a670 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e   table correspon
2a680 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65  ding to the inde
2a690 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  x */.};../*.** C
2a6a0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2a6b0 68 65 72 65 20 61 72 65 20 72 65 66 65 72 65 6e  here are referen
2a6c0 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
2a6d0 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c  n table .** pWal
2a6e0 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2a6f0 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20 73 61  ->iCur can be sa
2a700 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 74 68  tisfied using th
2a710 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b  e index.** pWalk
2a720 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2a730 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  >pIdx..*/.static
2a740 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65   int exprIdxCove
2a750 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
2a760 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2a770 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2a780 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
2a790 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
2a7a0 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78  =pWalker->u.pIdx
2a7b0 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26  Cover->iCur.   &
2a7c0 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  & sqlite3ColumnO
2a7d0 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e  fIndex(pWalker->
2a7e0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64  u.pIdxCover->pId
2a7f0 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  x, pExpr->iColum
2a800 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57  n)<0.  ){.    pW
2a810 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31  alker->eCode = 1
2a820 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
2a830 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65  _Abort;.  }.  re
2a840 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2a850 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  e;.}../*.** Dete
2a860 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65  rmine if an inde
2a870 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20  x pIdx on table 
2a880 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72  with cursor iCur
2a890 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a   contains will.*
2a8a0 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
2a8b0 20 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20   pExpr.  Return 
2a8c0 74 72 75 65 20 69 66 20 74 68 65 20 69 6e 64 65  true if the inde
2a8d0 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65  x does cover the
2a8e0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
2a8f0 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  nd false if the 
2a900 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
2a910 20 72 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c   references tabl
2a920 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61  e columns.** tha
2a930 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20  t are not found 
2a940 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  in the index pId
2a950 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65  x..**.** An inde
2a960 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78  x covering an ex
2a970 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74  pression means t
2a980 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
2a990 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61  on can be.** eva
2a9a0 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c  luated using onl
2a9b0 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  y the index and 
2a9c0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
2a9d0 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20  o lookup the.** 
2a9e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
2a9f0 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e  ble entry..*/.in
2aa00 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76  t sqlite3ExprCov
2aa10 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45  eredByIndex(.  E
2aa20 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
2aa30 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
2aa40 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a  to be tested */.
2aa50 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
2aa60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
2aa70 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
2aa80 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2aa90 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65   table */.  Inde
2aaa0 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2aab0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
2aac0 74 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  t might be used 
2aad0 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  for coverage */.
2aae0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
2aaf0 20 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72   struct IdxCover
2ab00 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28   xcov;.  memset(
2ab10 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
2ab20 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d  );.  xcov.iCur =
2ab30 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49   iCur;.  xcov.pI
2ab40 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78  dx = pIdx;.  w.x
2ab50 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
2ab60 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77  xprIdxCover;.  w
2ab70 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26  .u.pIdxCover = &
2ab80 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57  xcov;.  sqlite3W
2ab90 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
2aba0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e  r);.  return !w.
2abb0 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  eCode;.}.../*.**
2abc0 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2abd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2abe0 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
2abf0 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
2ac00 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72  er.** to count r
2ac10 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
2ac20 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  le columns in th
2ac30 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61  e arguments of a
2ac40 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20  n .** aggregate 
2ac50 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64  function, in ord
2ac60 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
2ac70 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75  the.** sqlite3Fu
2ac80 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20  nctionThisSrc() 
2ac90 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
2aca0 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20  ct SrcCount {.  
2acb0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
2acc0 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c   /* One particul
2acd0 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  ar FROM clause i
2ace0 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79  n a nested query
2acf0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b   */.  int nThis;
2ad00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ad10 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
2ad20 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72  o columns in pSr
2ad30 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  cList */.  int n
2ad40 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e  Other;      /* N
2ad50 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2ad60 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
2ad70 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  n other FROM cla
2ad80 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  uses */.};../*.*
2ad90 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
2ada0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2adb0 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a   to columns..*/.
2adc0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
2add0 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a  rcCount(Walker *
2ade0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2adf0 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Expr){.  /* The 
2ae00 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73  NEVER() on the s
2ae10 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65  econd term is be
2ae20 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e  cause sqlite3Fun
2ae30 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
2ae40 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79  ().  ** is alway
2ae50 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
2ae60 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2ae70 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61  zeAggregates() a
2ae80 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54  nd so the.  ** T
2ae90 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e  K_COLUMNs have n
2aea0 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76  ot yet been conv
2aeb0 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47  erted into TK_AG
2aec0 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20  G_COLUMN.  If.  
2aed0 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
2aee0 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20  onUsesThisSrc() 
2aef0 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e  is used differen
2af00 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72  tly in the futur
2af10 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45  e, the.  ** NEVE
2af20 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  R() will need to
2af30 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a   be removed. */.
2af40 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
2af50 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45  =TK_COLUMN || NE
2af60 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  VER(pExpr->op==T
2af70 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b  K_AGG_COLUMN) ){
2af80 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2af90 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
2afa0 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
2afb0 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53  pSrcCount;.    S
2afc0 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
2afd0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20  ->pSrc;.    int 
2afe0 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53  nSrc = pSrc ? pS
2aff0 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20  rc->nSrc : 0;.  
2b000 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72    for(i=0; i<nSr
2b010 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
2b020 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
2b030 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  ==pSrc->a[i].iCu
2b040 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
2b050 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53    }.    if( i<nS
2b060 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  rc ){.      p->n
2b070 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  This++;.    }els
2b080 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68  e{.      p->nOth
2b090 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  er++;.    }.  }.
2b0a0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2b0b0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2b0c0 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79  Determine if any
2b0d0 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
2b0e0 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46  s to the pExpr F
2b0f0 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63  unction referenc
2b100 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20  e.** pSrcList.  
2b110 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
2b120 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65  hey do.  Also re
2b130 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
2b140 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
2b150 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72   no arguments or
2b160 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61   has only consta
2b170 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
2b180 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70  eturn false if p
2b190 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63  Expr.** referenc
2b1a0 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e  es columns but n
2b1b0 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61  ot columns of ta
2b1c0 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53  bles found in pS
2b1d0 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73  rcList..*/.int s
2b1e0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
2b1f0 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a  esThisSrc(Expr *
2b200 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a  pExpr, SrcList *
2b210 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c  pSrcList){.  Wal
2b220 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
2b230 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20  SrcCount cnt;.  
2b240 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
2b250 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
2b260 4f 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  ON );.  w.xExprC
2b270 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72  allback = exprSr
2b280 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  cCount;.  w.xSel
2b290 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
2b2a0 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74  .  w.u.pSrcCount
2b2b0 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70   = &cnt;.  cnt.p
2b2c0 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a  Src = pSrcList;.
2b2d0 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b    cnt.nThis = 0;
2b2e0 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20  .  cnt.nOther = 
2b2f0 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  0;.  sqlite3Walk
2b300 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78  ExprList(&w, pEx
2b310 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
2b320 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73  return cnt.nThis
2b330 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72  >0 || cnt.nOther
2b340 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ==0;.}../*.** Ad
2b350 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
2b360 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
2b370 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
2b380 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
2b390 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
2b3a0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
2b3b0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
2b3c0 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
2b3d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2b3e0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
2b3f0 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
2b400 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
2b410 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
2b420 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
2b430 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
2b440 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
2b450 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
2b460 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
2b470 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
2b480 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
2b490 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  umn,.       &i. 
2b4a0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
2b4b0 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
2b4c0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
2b4d0 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
2b4e0 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
2b4f0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
2b500 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
2b510 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
2b520 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
2b530 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
2b540 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2b550 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
2b560 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
2b570 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
2b580 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
2b590 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
2b5a0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
2b5b0 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
2b5c0 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
2b5d0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
2b5e0 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
2b5f0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
2b600 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  unc,.       &i. 
2b610 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
2b620 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  }    ../*.** Thi
2b630 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61  s is the xExprCa
2b640 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65  llback for a tre
2b650 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73  e walker.  It is
2b660 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c   used to.** impl
2b670 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70  ement sqlite3Exp
2b680 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2b690 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74  es().  See sqlit
2b6a0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2b6b0 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61  regates.** for a
2b6c0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
2b6d0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
2b6e0 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
2b6f0 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57  egate(Walker *pW
2b700 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2b710 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
2b720 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
2b730 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
2b740 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  C;.  Parse *pPar
2b750 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
2b760 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
2b770 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
2b780 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f  cList;.  AggInfo
2b790 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43   *pAggInfo = pNC
2b7a0 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73  ->pAggInfo;..  s
2b7b0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2b7c0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
2b7d0 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
2b7e0 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
2b7f0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2b800 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2b810 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
2b820 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2b830 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
2b840 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43  MN );.      /* C
2b850 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2b860 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
2b870 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
2b880 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
2b890 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
2b8a0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
2b8b0 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
2b8c0 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73  ( ALWAYS(pSrcLis
2b8d0 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
2b8e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2b8f0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53  item *pItem = pS
2b900 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  rcList->a;.     
2b910 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
2b920 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
2b930 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2b940 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2b950 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b  gInfo_col *pCol;
2b960 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b970 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2b980 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
2b990 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2b9a0 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ed) );.         
2b9b0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
2b9c0 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
2b9d0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
2b9e0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
2b9f0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
2ba00 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
2ba10 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
2ba20 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2ba30 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
2ba40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
2ba50 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
2ba60 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
2ba70 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
2ba80 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
2ba90 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
2baa0 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
2bab0 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
2bac0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
2bad0 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
2bae0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
2baf0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2bb00 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
2bb10 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
2bb20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
2bb30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2bb40 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
2bb50 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
2bb60 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
2bb70 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2bb80 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
2bb90 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
2bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2bbb0 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
2bbc0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
2bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2bbe0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2bbf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2bc00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
2bc10 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
2bc20 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
2bc30 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
2bc40 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
2bc50 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
2bc60 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
2bc70 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2bc80 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
2bc90 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
2bca0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
2bcb0 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
2bcc0 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
2bcd0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2bce0 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
2bcf0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
2bd00 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
2bd10 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
2bd20 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
2bd30 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
2bd40 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2bd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2bd60 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2bd70 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2bd80 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
2bd90 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
2bda0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
2bdb0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
2bdc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2bdd0 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
2bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2bdf0 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
2be00 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
2be10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2be20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2be30 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
2be40 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
2be50 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
2be60 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
2be70 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2be80 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
2be90 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2bea0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2beb0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
2bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bed0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2bee0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
2bef0 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
2bf00 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
2bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
2bf20 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2bf30 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf50 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2bf60 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
2bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2bf80 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2bf90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bfa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bfb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bfc0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2bfd0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
2bfe0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2bff0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2c000 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
2c010 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
2c020 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
2c030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c040 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c050 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
2c060 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
2c070 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
2c080 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
2c090 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
2c0a0 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
2c0b0 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
2c0c0 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
2c0d0 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
2c0e0 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
2c0f0 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
2c100 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
2c110 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
2c120 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
2c130 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
2c140 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
2c150 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2c160 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
2c170 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2c180 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2c190 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2c1a0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
2c1b0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2c1c0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
2c1d0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
2c1e0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2c1f0 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
2c200 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2c210 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
2c220 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
2c230 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2c240 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
2c250 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
2c260 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
2c270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2c280 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2c290 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2c2a0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
2c2b0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
2c2c0 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
2c2d0 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
2c2e0 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
2c2f0 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
2c300 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
2c310 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2c320 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
2c330 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
2c340 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
2c350 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
2c360 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
2c370 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2c380 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
2c390 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
2c3a0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2c3b0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
2c3c0 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
2c3d0 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
2c3e0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2c3f0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
2c400 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2c410 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2c420 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65  rCompare(0, pIte
2c430 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
2c440 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
2c450 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2c460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c470 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2c480 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
2c490 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2c4a0 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
2c4b0 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
2c4c0 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
2c4d0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
2c4e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2c4f0 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
2c500 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
2c510 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
2c520 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
2c530 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
2c540 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c550 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
2c560 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2c570 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2c580 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2c590 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2c5a0 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
2c5b0 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
2c5c0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2c5d0 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
2c5e0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2c5f0 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
2c600 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2c610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2c620 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2c630 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
2c640 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2c650 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
2c660 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
2c670 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
2c680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c690 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
2c6a0 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ken, .          
2c6b0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2c6c0 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  x.pList ? pExpr-
2c6d0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
2c6e0 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
2c6f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2c700 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
2c710 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2c720 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2c730 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
2c740 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2c750 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2c770 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2c780 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
2c790 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2c7a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c7b0 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
2c7c0 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
2c7d0 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
2c7e0 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
2c7f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2c800 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2c810 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2c820 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
2c830 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2c840 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2c850 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2c860 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2c870 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2c880 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20  gg = (i16)i;.   
2c890 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2c8a0 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2c8b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c8c0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
2c8d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c8e0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2c8f0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2c900 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2c910 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2c920 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2c930 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2c940 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
2c950 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2c960 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2c970 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
2c980 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ct);.  pWalker->
2c990 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20  walkerDepth++;. 
2c9a0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2c9b0 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76  inue;.}.static v
2c9c0 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  oid analyzeAggre
2c9d0 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64  gatesInSelectEnd
2c9e0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2c9f0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2ca00 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2ca10 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
2ca20 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  .  pWalker->walk
2ca30 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a  erDepth--;.}../*
2ca40 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
2ca50 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
2ca60 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
2ca70 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
2ca80 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
2ca90 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
2caa0 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41  to be added to A
2cab0 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  ggInfo object th
2cac0 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f  at pNC->pAggInfo
2cad0 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  .** points to.  
2cae0 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  Additional entri
2caf0 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74  es are made on t
2cb00 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  he AggInfo objec
2cb10 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72  t as.** necessar
2cb20 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2cb30 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2cb40 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
2cb50 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
2cb60 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
2cb70 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
2cb80 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
2cb90 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
2cba0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2cbb0 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
2cbc0 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
2cbd0 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
2cbe0 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
2cbf0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2cc00 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
2cc10 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2cc20 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2cc30 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
2cc40 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2cc50 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2cc60 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b  atesInSelectEnd;
2cc70 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68  .  w.walkerDepth
2cc80 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20   = 0;.  w.u.pNC 
2cc90 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28  = pNC;.  assert(
2cca0 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
2ccb0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
2ccc0 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
2ccd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
2cce0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2ccf0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2cd00 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
2cd10 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
2cd20 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
2cd30 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2cd40 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
2cd50 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
2cd60 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
2cd70 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
2cd80 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
2cd90 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2cda0 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
2cdb0 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
2cdc0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
2cdd0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2cde0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
2cdf0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
2ce00 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
2ce10 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
2ce20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
2ce30 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2ce40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2ce50 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2ce60 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
2ce70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
2ce80 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2ce90 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
2cea0 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
2ceb0 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
2cec0 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
2ced0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2cee0 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
2cef0 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
2cf00 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
2cf10 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2cf20 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2cf30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
2cf40 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
2cf50 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
2cf60 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
2cf70 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
2cf80 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
2cf90 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
2cfa0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
2cfb0 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20   purpose..**.** 
2cfc0 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73  If a register is
2cfd0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
2cfe0 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c   used by the col
2cff0 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a  umn cache, then.
2d000 2a 2a 20 74 68 65 20 64 65 61 6c 6c 6f 63 61 74  ** the deallocat
2d010 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20  ion is deferred 
2d020 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e  until the column
2d030 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74   cache line that
2d040 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67   uses.** the reg
2d050 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74  ister becomes st
2d060 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ale..*/.void sql
2d070 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2d080 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
2d090 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
2d0a0 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
2d0b0 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
2d0c0 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
2d0d0 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69  empReg) ){.    i
2d0e0 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
2d0f0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
2d100 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50     for(i=0, p=pP
2d110 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
2d120 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
2d130 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ache; i++, p++){
2d140 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52  .      if( p->iR
2d150 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
2d160 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
2d170 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
2d180 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
2d190 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  }.    pParse->aT
2d1a0 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
2d1b0 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
2d1c0 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
2d1d0 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
2d1e0 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
2d1f0 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
2d200 76 65 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f  ve registers..*/
2d210 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
2d220 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
2d230 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67  pParse, int nReg
2d240 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
2d250 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72   if( nReg==1 ) r
2d260 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74  eturn sqlite3Get
2d270 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
2d280 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69  .  i = pParse->i
2d290 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20  RangeReg;.  n = 
2d2a0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2d2b0 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e  g;.  if( nReg<=n
2d2c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2d2d0 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63  !usedAsColumnCac
2d2e0 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b  he(pParse, i, i+
2d2f0 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72  n-1) );.    pPar
2d300 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d  se->iRangeReg +=
2d310 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
2d320 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20  e->nRangeReg -= 
2d330 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nReg;.  }else{. 
2d340 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e     i = pParse->n
2d350 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
2d360 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
2d370 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
2d380 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  .}.void sqlite3R
2d390 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2d3a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2d3b0 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
2d3c0 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d  g){.  if( nReg==
2d3d0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
2d3e0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
2d3f0 50 61 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20  Parse, iReg);.  
2d400 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2d410 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2d420 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
2d430 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66  Reg, nReg);.  if
2d440 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e  ( nReg>pParse->n
2d450 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20  RangeReg ){.    
2d460 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2d470 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50  g = nReg;.    pP
2d480 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2d490 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
2d4a0 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65  *.** Mark all te
2d4b0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2d4c0 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61  s as being unava
2d4d0 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
2d4e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2d4f0 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2d500 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
2d510 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65  ){.  pParse->nTe
2d520 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61  mpReg = 0;.  pPa
2d530 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2d540 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c   0;.}../*.** Val
2d550 69 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65  idate that no te
2d560 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2d570 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68   falls within th
2d580 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46  e range of.** iF
2d590 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63  irst..iLast, inc
2d5a0 6c 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f  lusive.  This ro
2d5b0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
2d5c0 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ll from within a
2d5d0 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
2d5e0 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  ments..*/.#ifdef
2d5f0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
2d600 74 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73  t sqlite3NoTemps
2d610 49 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  InRange(Parse *p
2d620 50 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73  Parse, int iFirs
2d630 74 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20  t, int iLast){. 
2d640 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50   int i;.  if( pP
2d650 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e  arse->nRangeReg>
2d660 30 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  0.   && pParse->
2d670 69 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65  iRangeReg+pParse
2d680 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3e 20 69 46  ->nRangeReg > iF
2d690 69 72 73 74 0a 20 20 20 26 26 20 70 50 61 72 73  irst.   && pPars
2d6a0 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3c 3d 20  e->iRangeReg <= 
2d6b0 69 4c 61 73 74 0a 20 20 29 7b 0a 20 20 20 20 20  iLast.  ){.     
2d6c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2d6d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
2d6e0 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b  e->nTempReg; i++
2d6f0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
2d700 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d  e->aTempReg[i]>=
2d710 69 46 69 72 73 74 20 26 26 20 70 50 61 72 73 65  iFirst && pParse
2d720 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69  ->aTempReg[i]<=i
2d730 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
2d740 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
2d750 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2d760 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2d770 5f 44 45 42 55 47 20 2a 2f 0a                    _DEBUG */.