/ Hex Artifact Content
Login

Artifact 907d7de6cac23e55e32f22133a4fa8ca1558d7fe7c9a37e01feebb1106416fe7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
0fd0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
0fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
0ff0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1000: 29 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  ) works the same
1010: 20 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72   exact that it r
1020: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65  eturns the.** de
1030: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1040: 69 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20  if pExpr has no 
1050: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
1060: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  n..**.** The col
1070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1080: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
1090: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
10a0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
10b0: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
10c0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
10d0: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
10f0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
1100: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
1110: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
1120: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
1130: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
1140: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
1150: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1160: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1180: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1190: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
11b0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
11c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
11d0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
11e0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
11f0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >op;.    if( p->
1200: 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72  flags & EP_Gener
1210: 69 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ic ) break;.    
1220: 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f  if( (op==TK_AGG_
1230: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
1240: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
1250: 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    || op==TK_REGI
1260: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54  STER || op==TK_T
1270: 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26 20  RIGGER).     && 
1280: 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 29  p->pTab!=0.    )
1290: 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54  {.      /* op==T
12a0: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
12b0: 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73  >pTab!=0 happens
12c0: 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20   when pExpr was 
12d0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20  originally.     
12e0: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
12f0: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
1300: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
1310: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
1320: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  ister */.      i
1330: 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  nt j = p->iColum
1340: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  n;.      if( j>=
1350: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
1360: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
1370: 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a   p->pTab->aCol[j
1380: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
1390: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
13a0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
13b0: 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
13c0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13e0: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
13f0: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1400: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1410: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1420: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1430: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1440: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1450: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1460: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
1470: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
1480: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
1490: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
14a0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
14b0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
14c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14d0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
14e0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
14f0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
1500: 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67   (p->pLeft->flag
1510: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
1520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20  =0 ){.        p 
1530: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1550: 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20 3d 20   Expr *pNext  = 
1560: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1570: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
1580: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
1590: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
15a0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
15b0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
15c0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
15d0: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
15e0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
15f0: 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68 6f 6c   /* p->flags hol
1600: 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20 61 6e  ds EP_Collate an
1610: 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  d p->pLeft->flag
1620: 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41 6e 64  s does not.  And
1630: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 78  .        ** p->x
1640: 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f 74 2e  .pSelect cannot.
1650: 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70 4c 65    So if p->x.pLe
1660: 66 74 20 65 78 69 73 74 73 2c 20 69 74 20 6d 75  ft exists, it mu
1670: 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20 20 20  st hold at.     
1680: 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20     ** least one 
1690: 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68 75 73  EP_Collate. Thus
16a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
16b0: 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a 20 20  wo ALWAYS. */.  
16c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 2e 70        if( p->x.p
16d0: 4c 69 73 74 21 3d 30 20 26 26 20 41 4c 57 41 59  List!=0 && ALWAY
16e0: 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  S(!ExprHasProper
16f0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
1700: 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ct)) ){.        
1710: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
1730: 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  YS(i<p->x.pList-
1740: 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20  >nExpr); i++){. 
1750: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45             if( E
1760: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1770: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1780: 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74  pExpr, EP_Collat
1790: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
17a0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78      pNext = p->x
17b0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
17c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1800: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
1810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1820: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
1830: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1840: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
1850: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
1860: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
1870: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1880: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
1890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
18a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18b0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
18c0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
18d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
18e0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
18f0: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
1900: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1910: 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c 6c  .** defautl coll
1920: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
1930: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1950: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
1960: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1970: 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  q() routine work
1980: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
1990: 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65 74  t that it.** ret
19a0: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19b0: 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64  re is no defined
19c0: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 43   collation..*/.C
19d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
19e0: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61 72  xprNNCollSeq(Par
19f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a00: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
1a10: 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Seq *p = sqlite3
1a20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1a30: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  se, pExpr);.  if
1a40: 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50 61  ( p==0 ) p = pPa
1a50: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1a60: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  ll;.  assert( p!
1a70: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a90: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74 77  n TRUE if the tw
1aa0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68 61  o expressions ha
1ab0: 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  ve equivalent co
1ac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ad0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1ae0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63  3ExprCollSeqMatc
1af0: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1b00: 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
1b10: 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53 65   *pE2){.  CollSe
1b20: 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c 69  q *pColl1 = sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a 20  (pParse, pE1);. 
1b50: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
1b60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
1b70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b80: 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  pE2);.  return s
1b90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ba0: 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f  oll1->zName, pCo
1bb0: 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b 0a  ll2->zName)==0;.
1bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1bd0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
1be0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1bf0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1c00: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1c10: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1c20: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1c30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c40: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1c50: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1c60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1c70: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1c80: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
1c90: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1ca0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
1cb0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
1cc0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
1cd0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1ce0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1cf0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1d00: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1d10: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1d20: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1d30: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1d40: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1d50: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1d60: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1d70: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1d80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d90: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1da0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
1db0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1dc0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
1dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1de0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1e00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1e10: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1e20: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1e30: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1e40: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1e50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e60: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1e70: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1e80: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1eb0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ec0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ed0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1ee0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1ef0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1f00: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1f10: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1f20: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1f30: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1f40: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1f50: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1f60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1f70: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1f80: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1f90: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1fa0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1fb0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1fc0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1fd0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1fe0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1ff0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2000: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2010: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2020: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2030: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2040: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2050: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2060: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2070: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
2080: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
2090: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
20a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
20b0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
20c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
20d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
20e0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
20f0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2100: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2110: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2120: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2130: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2140: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2150: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2160: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2170: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
2180: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
2190: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
21b0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
21c0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
21f0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2200: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2210: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2220: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2230: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2240: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2250: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2260: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2270: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
2280: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
2290: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
22a0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
22b0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
22c0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
22d0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
22e0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
22f0: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2300: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2310: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2320: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2330: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2340: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2350: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2360: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2370: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
2380: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
2390: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
23a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23b0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
23c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
23d0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
23e0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
23f0: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2400: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2410: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2420: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2430: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2440: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2460: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2470: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2480: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
2490: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
24a0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
24b0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
24c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
24d0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
24e0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
24f0: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2500: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2510: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2520: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2530: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2540: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2550: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2560: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2570: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2580: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
2590: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
25a0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
25b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25c0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
25d0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
25e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
25f0: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2600: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2610: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2620: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2630: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2640: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2650: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2660: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2670: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2680: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
2690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
26a0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
26b0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
26c0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
26d0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
26e0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
26f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2700: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2710: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2720: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2730: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2740: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2750: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2760: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2770: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2780: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
2790: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
27a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27b0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
27c0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
27d0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
27e0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
27f0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2800: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2810: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2820: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2830: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2840: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2850: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2860: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2870: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2880: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
2890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
28b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
28c0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
28d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
28e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
28f0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2900: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2910: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2920: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2940: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2950: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2960: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2970: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2980: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
2990: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
29a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
29b0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
29c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
29d0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
29e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
29f0: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2a00: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2a10: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2a20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2a30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2a40: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2a50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2a70: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2a80: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
2a90: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
2aa0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
2ab0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
2ac0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
2ad0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
2ae0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2af0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2b00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2b10: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2b20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2b30: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2b40: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2b50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2b60: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2b70: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2b80: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
2b90: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
2ba0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2bb0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
2bc0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
2bd0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2c00: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2c10: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2c20: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2c30: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2c40: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2c60: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2c70: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2c80: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
2c90: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
2ca0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
2cb0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
2cc0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
2cd0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
2ce0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2cf0: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2d00: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2d10: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2d20: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2d30: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2d40: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2d50: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2d60: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2d70: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2d80: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
2d90: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
2da0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
2db0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
2dc0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
2dd0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
2de0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2e00: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2e20: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2e30: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2e60: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2e70: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2e80: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2e90: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ea0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2eb0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ec0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ed0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2ee0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2ef0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2f00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2f10: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2f20: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2f30: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2f40: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2f50: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2f60: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2f70: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2f80: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2fb0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2fc0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2fd0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2fe0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2ff0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
3000: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
3010: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
3020: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
3030: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
3040: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
3050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3060: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
3070: 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70  bexpression of p
3080: 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74  Vector that is t
3090: 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d  he i-th.** colum
30a0: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
30b0: 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69  (numbered starti
30c0: 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65  ng with 0).  The
30d0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
30e0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73  ensure that i is
30f0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a   within range..*
3100: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3110: 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c  is really a scal
3120: 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22  ar (and "scalar"
3130: 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73   here includes s
3140: 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61  ubqueries.** tha
3150: 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  t return a singl
3160: 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20  e column!) then 
3170: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75  return pVector u
3180: 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  nmodified..**.**
3190: 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73   pVector retains
31a0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
31b0: 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65 78  e returned subex
31c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
31d0: 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69 73  If the vector is
31e0: 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20   a (SELECT ...) 
31f0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
3200: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a  ion returned is.
3210: 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70 72  ** just the expr
3220: 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  ession for the i
3230: 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
3240: 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
3250: 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65  may.** not be re
3260: 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ady for evaluati
3270: 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74  on because the t
3280: 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20  able cursor has 
3290: 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
32a0: 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45  positioned..*/.E
32b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74  xpr *sqlite3Vect
32c0: 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45  orFieldSubexpr(E
32d0: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e  xpr *pVector, in
32e0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
32f0: 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  i<sqlite3ExprVec
3300: 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29  torSize(pVector)
3310: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
3320: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56  3ExprIsVector(pV
3330: 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73  ector) ){.    as
3340: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f  sert( pVector->o
3350: 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72  p2==0 || pVector
3360: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
3370: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65  R );.    if( pVe
3380: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3390: 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e  ECT || pVector->
33a0: 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  op2==TK_SELECT )
33b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
33c0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
33d0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
33e0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
33f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3400: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3410: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3430: 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  pVector;.}../*.*
3440: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
3450: 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20  turn a new Expr 
3460: 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65  object which whe
3470: 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73  n passed to.** s
3480: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
3490: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61   will generate a
34a0: 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64  ll necessary cod
34b0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  e to compute.** 
34c0: 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f  the iField-th co
34d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
34e0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56  or expression pV
34f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ector..**.** It 
3500: 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f  is ok for pVecto
3510: 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  r to be a scalar
3520: 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69   (as long as iFi
3530: 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e  eld==0).  .** In
3540: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
3550: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
3560: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44  ike sqlite3ExprD
3570: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  up()..**.** The 
3580: 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20  caller owns the 
3590: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
35a0: 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70  ject and is resp
35b0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65  onsible for.** e
35c0: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
35d0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
35e0: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
35f0: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  freed..**.** The
3600: 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20   caller retains 
3610: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65  ownership of pVe
3620: 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f  ctor.  If pVecto
3630: 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54  r is a TK_SELECT
3640: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
3650: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77 69  turned object wi
3660: 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65  ll reference pVe
3670: 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63  ctor and so pVec
3680: 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a  tor must remain.
3690: 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ** valid for the
36a0: 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74   life of the ret
36b0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49  urned object.  I
36c0: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
36d0: 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61  K_VECTOR.** or a
36e0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
36f0: 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20  on, then it can 
3700: 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
3710: 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  on as this routi
3720: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a  ne.** returns..*
3730: 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20  *.** A trick to 
3740: 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43  cause a TK_SELEC
3750: 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20  T pVector to be 
3760: 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72  deleted together
3770: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74   with.** the ret
3780: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3790: 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74  t is to attach t
37a0: 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68  he pVector to th
37b0: 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a  e pRight field.*
37c0: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
37d0: 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  d TK_SELECT_COLU
37e0: 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a  MN Expr object..
37f0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3800: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
3810: 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ld(.  Parse *pPa
3820: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3830: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3840: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3850: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
3860: 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20  ector.  List of 
3870: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61  expressions or a
3880: 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20   sub-SELECT */. 
3890: 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20   int iField     
38a0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
38b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
38c0: 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  tor to return */
38d0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74  .){.  Expr *pRet
38e0: 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d  ;.  if( pVector-
38f0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
3910: 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45  ector->flags & E
3920: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20  P_xIsSelect );. 
3930: 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c     /* The TK_SEL
3940: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3950: 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  node:.    **.   
3960: 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20   ** pLeft:      
3970: 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e       pVector con
3980: 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43  taining TK_SELEC
3990: 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e  T.  Not deleted.
39a0: 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20  .    ** pRight: 
39b0: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65           not use
39c0: 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76  d.  But recursiv
39d0: 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  ely deleted..   
39e0: 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20   ** iColumn:    
39f0: 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20       Index of a 
3a00: 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f  column in pVecto
3a10: 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a  r.    ** iTable:
3a20: 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20 74            0 or t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
3a40: 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53 20  umns on the LHS 
3a50: 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74  of an assignment
3a60: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3a70: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3a80: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3a90: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3aa0: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3ab0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3ac0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
3ad0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
3ae0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
3af0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
3b00: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
3b10: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3b20: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3b30: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3b40: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3b50: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3b60: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3b70: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3b80: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3b90: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3ba0: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3bb0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
3bc0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
3bd0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
3be0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
3bf0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
3c00: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3c10: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3c20: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3c30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3c40: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3c50: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3c60: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3c70: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3c80: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3c90: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3ca0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3cb0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
3cc0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Ret ){.      pRe
3cd0: 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69  t->iColumn = iFi
3ce0: 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  eld;.      pRet-
3cf0: 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72  >pLeft = pVector
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3d10: 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70  rt( pRet==0 || p
3d20: 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  Ret->iTable==0 )
3d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
3d50: 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63  TK_VECTOR ) pVec
3d60: 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  tor = pVector->x
3d70: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
3d80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65  ].pExpr;.    pRe
3d90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3da0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
3db0: 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a  Vector, 0);.  }.
3dc0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
3de0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f  ssion pExpr is o
3df0: 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54  f type TK_SELECT
3e00: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
3e10: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69  to evaluate.** i
3e20: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  t. Return the re
3e30: 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20  gister in which 
3e40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
3e50: 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65  ored (or, if the
3e60: 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
3e70: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3e80: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  n one column, th
3e90: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3ea0: 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74  ray.** of regist
3eb0: 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65  ers in which the
3ec0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3ed0: 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  d)..**.** If pEx
3ee0: 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53  pr is not a TK_S
3ef0: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3f00: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
3f10: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
3f20: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
3f30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3f40: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
3f50: 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  eg = 0;.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3f70: 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
3f80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3f90: 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c  ){.    reg = sql
3fa0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
3fb0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
3fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
3fd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
3fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
3ff0: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
4000: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
4010: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4020: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4030: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4040: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4050: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4060: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4070: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4080: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
4090: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
40a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
40b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
40c0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
40d0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
40e0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
40f0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
4100: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
4110: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4120: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4130: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4140: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4150: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4160: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4170: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4180: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
4190: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
41a0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
41b0: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
41c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
41d0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
41e0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
41f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
4200: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
4210: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4220: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4230: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4240: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4250: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4260: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4270: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4280: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
4290: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
42a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
42b0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
42c0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
42d0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
42e0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
42f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4300: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
4310: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4320: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4330: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4340: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4350: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
4390: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
43a0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
43b0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
43c0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
43d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
43e0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
4410: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4420: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4450: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4460: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4470: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4480: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
4490: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
44a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
44b0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
44c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
44d0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
44e0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
44f0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
4500: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4510: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4520: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4530: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4540: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4550: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4560: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4570: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4580: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
45a0: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
45b0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
45c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
45d0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
45e0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
45f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
4600: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
4610: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4620: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4630: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4640: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4650: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4660: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4670: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4680: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
4690: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
46a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
46b0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
46c0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
46d0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
46e0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
46f0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4700: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
4710: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4720: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4730: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4740: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4750: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4770: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4780: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
4790: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
47a0: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
47b0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
47c0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
47d0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
47e0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
47f0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
4800: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4820: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4830: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4840: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4850: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4860: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4870: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4880: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4890: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
48a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
48b0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
48c0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
48d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
48e0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
48f0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4900: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
4910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4920: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4930: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4950: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4960: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4970: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4980: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4990: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
49a0: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
49b0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
49c0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
49d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
49e0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
49f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4a00: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4a10: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4a20: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4a30: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4a50: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  abel(v);..  if( 
4a60: 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45 78  nLeft!=sqlite3Ex
4a70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69  prVectorSize(pRi
4a80: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
4a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4aa0: 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
4ab0: 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72 65  isused");.    re
4ac0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ad0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4ae0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
4af0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
4b20: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20  p==TK_ISNOT .   
4b30: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72  ==TK_LT || pExpr
4b50: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20  ->op==TK_GT .   
4b60: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b70: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72  ==TK_LE || pExpr
4b80: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29  ->op==TK_GE .  )
4b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
4ba0: 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45  r->op==op || (pE
4bb0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26  xpr->op==TK_IS &
4bc0: 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20  & op==TK_EQ).   
4bd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78           || (pEx
4be0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4bf0: 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29   && op==TK_NE) )
4c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c10: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d  0 || pExpr->op!=
4c20: 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  op );.  assert( 
4c30: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4c40: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
4c50: 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53  op );..  p5 |= S
4c60: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20  QLITE_STOREP2;. 
4c70: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20   if( opx==TK_LE 
4c80: 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20  ) opx = TK_LT;. 
4c90: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20   if( opx==TK_GE 
4ca0: 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a  ) opx = TK_GT;..
4cb0: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4cc0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4cd0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4ce0: 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43  regRight = exprC
4cf0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
4d00: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20  rse, pRight);.. 
4d10: 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f   for(i=0; 1 /*Lo
4d20: 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65  op exits by "bre
4d30: 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20  ak"*/; i++){.   
4d40: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
4d50: 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  0, regFree2 = 0;
4d60: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a  .    Expr *pL, *
4d70: 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c  pR; .    int r1,
4d80: 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28   r2;.    assert(
4d90: 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74   i>=0 && i<nLeft
4da0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20   );.    if( i>0 
4db0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  ) sqlite3ExprCac
4dc0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
4dd0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4de0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4df0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4e00: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e10: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e20: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e30: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e40: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e50: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e60: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e70: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e80: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e90: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4ea0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4eb0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4ec0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ed0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ee0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ef0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f00: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f10: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f20: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f30: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f40: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f50: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f60: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f70: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f80: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f90: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4fa0: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fb0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fc0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fd0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fe0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4ff0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5000: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5010: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5020: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5030: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5040: 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70  i>0 ) sqlite3Exp
5050: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
5060: 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c  );.    if( i==nL
5070: 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62  eft-1 ){.      b
5080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5090: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29  if( opx==TK_EQ )
50a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
50b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
50c0: 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64  IfNot, dest, add
50d0: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
50e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
50f0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
5100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
5110: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29  if( opx==TK_NE )
5120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5140: 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f  If, dest, addrDo
5150: 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ne); VdbeCoverag
5160: 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c  e(v);.      p5 |
5170: 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  = SQLITE_KEEPNUL
5180: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
5190: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
51a0: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  TK_LT || op==TK_
51b0: 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20  GT || op==TK_LE 
51c0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  || op==TK_GE );.
51d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c  eAddOp2(v, OP_El
51f0: 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72  seNotEq, 0, addr
5200: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Done);.      Vdb
5210: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
5220: 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20  p==TK_LT);.     
5230: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
5240: 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20  v, op==TK_GT);. 
5250: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5260: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45  eIf(v, op==TK_LE
5270: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5280: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
5290: 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28  K_GE);.      if(
52a0: 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70   i==nLeft-2 ) op
52b0: 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  x = op;.    }.  
52c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
52d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
52e0: 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66  ddrDone);.}..#if
52f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
5300: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
5310: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
5320: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
5330: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
5340: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
5350: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
5360: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
5370: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
5380: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5390: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
53a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
53b0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
53c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
53d0: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
53e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
53f0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
5400: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
5410: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5420: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
5430: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
5440: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
5450: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5460: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
5470: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
5480: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
5490: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
54a0: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
54b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
54c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
54d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
54e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
54f0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
5500: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
5510: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
5520: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
5530: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
5540: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
5550: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
5560: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
5570: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5580: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
5590: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
55a0: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
55b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
55c0: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
55d0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
55e0: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
55f0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
5600: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
5610: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
5620: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
5630: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
5640: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
5650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5660: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
5670: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5680: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5690: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
56a0: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
56b0: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
56c0: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
56d0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
56e0: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
56f0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
5700: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5710: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5720: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5730: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
5740: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
5750: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
5760: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
5770: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
5780: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5790: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
57a0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20  t *pSelect, int 
57b0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65  *pnHeight){.  Se
57c0: 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70  lect *p;.  for(p
57d0: 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70  =pSelect; p; p=p
57e0: 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68  ->pPrior){.    h
57f0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5800: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
5810: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5820: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
5830: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5840: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5850: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
5860: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5870: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
5880: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5890: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
58a0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
58b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
58c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
58d0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
58e0: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
58f0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
5900: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
5910: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
5920: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
5930: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
5940: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
5950: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
5960: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
5970: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
5980: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
5990: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
59a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
59b0: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
59c0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
59d0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
59e0: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
59f0: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
5a00: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
5a10: 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67  pagate EP_Propag
5a20: 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f  ate flags up fro
5a30: 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74  m Expr.x.pList t
5a40: 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a  o Expr.flags,.**
5a50: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
5a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a70: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
5a80: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
5a90: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5aa0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
5ab0: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
5ac0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5ad0: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
5ae0: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
5af0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5b00: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5b10: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5b20: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
5b30: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
5b40: 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74  e if( p->x.pList
5b50: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
5b60: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
5b70: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
5b80: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20      p->flags |= 
5b90: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73  EP_Propagate & s
5ba0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
5bb0: 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  ags(p->x.pList);
5bc0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
5bd0: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
5be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
5bf0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
5c00: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
5c10: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
5c20: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
5c30: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
5c40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
5c50: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
5c60: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
5c70: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
5c80: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
5c90: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
5ca0: 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70  gate all EP_Prop
5cb0: 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d  agate flags from
5cc0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
5cd0: 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66  t into.** Expr.f
5ce0: 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  lags. .*/.void s
5cf0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
5d00: 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73  ghtAndFlags(Pars
5d10: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
5d20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  *p){.  if( pPars
5d30: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
5d40: 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68  ;.  exprSetHeigh
5d50: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t(p);.  sqlite3E
5d60: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
5d70: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
5d80: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
5d90: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
5da0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
5db0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
5dc0: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
5dd0: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
5de0: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
5df0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
5e00: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
5e10: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
5e20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5e30: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5e40: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
5e50: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
5e60: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73   nHeight;.}.#els
5e70: 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69  e /* ABOVE:  Hei
5e80: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
5e90: 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a  enabled.  BELOW:
5ea0: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
5eb0: 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a  ent off */./*.**
5ec0: 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   Propagate all E
5ed0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5ee0: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
5ef0: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
5f00: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
5f10: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5f20: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
5f30: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
5f40: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5f50: 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74   p && p->x.pList
5f60: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
5f70: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
5f80: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  lect) ){.    p->
5f90: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
5fa0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
5fb0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
5fc0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  x.pList);.  }.}.
5fd0: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
5fe0: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
5ff0: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
6000: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
6010: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6020: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
6030: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
6040: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
6050: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
6060: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
6070: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
6080: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
6090: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
60a0: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
60b0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
60c0: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
60d0: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
60e0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
60f0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
6100: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
6110: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
6120: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
6130: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
6140: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
6150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
6160: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
6170: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
6180: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
6190: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
61a0: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
61b0: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
61c0: 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64  erformed.  The d
61d0: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
61e0: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
61f0: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
6200: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
6210: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
6220: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
6230: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
6240: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
6250: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
6260: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
6270: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
6280: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
6290: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
62a0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
62b0: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
62c0: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
62d0: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
62e0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
62f0: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
6300: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
6310: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
6320: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
6330: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
6340: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
6350: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
6360: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
6370: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
6380: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
6390: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
63a0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
63b0: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
63c0: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
63d0: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
63e0: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
63f0: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
6400: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
6410: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
6420: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6430: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
6440: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6450: 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74  RawNN() */.  int
6460: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6470: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6480: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
6490: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
64a0: 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  en,    /* Token 
64b0: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
64c0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
64d0: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
64e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
64f0: 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20   dequote */.){. 
6500: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
6510: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
6520: 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b   int iValue = 0;
6530: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
6540: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
6550: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21  n ){.    if( op!
6560: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70  =TK_INTEGER || p
6570: 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20  Token->z==0.    
6580: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
6590: 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d  GetInt32(pToken-
65a0: 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20  >z, &iValue)==0 
65b0: 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  ){.      nExtra 
65c0: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20  = pToken->n+1;. 
65d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61       assert( iVa
65e0: 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  lue>=0 );.    }.
65f0: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c    }.  pNew = sql
6600: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
6610: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
6620: 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66  r)+nExtra);.  if
6630: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65  ( pNew ){.    me
6640: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
6650: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20  zeof(Expr));.   
6660: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
6670: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
6680: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
6690: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
66a0: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
66b0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
66c0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
66d0: 61 6c 75 65 7c 45 50 5f 4c 65 61 66 3b 0a 20 20  alue|EP_Leaf;.  
66e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
66f0: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
6700: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6710: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6720: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
6730: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6740: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6750: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
6760: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
6770: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
6780: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
6790: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
67a0: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
67b0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
67c0: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
67d0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
67e0: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
67f0: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
6800: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
6810: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
6820: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
6830: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6840: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6850: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
6860: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
6870: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
6880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6890: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
68a0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
68b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
68c0: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
68d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
68e0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
68f0: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
6900: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
6910: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
6920: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
6930: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6940: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6950: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
6960: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6980: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
6990: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
69a0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
69b0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
69c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
69d0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
69e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
69f0: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
6a00: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
6a10: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6a20: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
6a30: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6a40: 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    x.n = sqlite3S
6a50: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 3b  trlen30(zToken);
6a60: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
6a70: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f  3ExprAlloc(db, o
6a80: 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  p, &x, 0);.}../*
6a90: 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74 72  .** Attach subtr
6aa0: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
6ab0: 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70 72  ight to the Expr
6ac0: 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a   node pRoot..**.
6ad0: 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c  ** If pRoot==NUL
6ae0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  L that means tha
6af0: 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  t a memory alloc
6b00: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
6b10: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
6b20: 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74  that case, delet
6b30: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 70  e the subtrees p
6b40: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
6b50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6b60: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
6b70: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  es(.  sqlite3 *d
6b80: 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74  b,.  Expr *pRoot
6b90: 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  ,.  Expr *pLeft,
6ba0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a  .  Expr *pRight.
6bb0: 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d  ){.  if( pRoot==
6bc0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
6bd0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6be0: 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
6bf0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
6c00: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
6c10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6c20: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
6c30: 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  e{.    if( pRigh
6c40: 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  t ){.      pRoot
6c50: 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68  ->pRight = pRigh
6c60: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c70: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c80: 61 67 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e  agate & pRight->
6c90: 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20  flags;.    }.   
6ca0: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
6cb0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74      pRoot->pLeft
6cc0: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
6cd0: 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pRoot->flags |= 
6ce0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70  EP_Propagate & p
6cf0: 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Left->flags;.   
6d00: 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65   }.    exprSetHe
6d10: 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d  ight(pRoot);.  }
6d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
6d30: 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20  te an Expr node 
6d40: 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d  which joins as m
6d50: 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72  any as two subtr
6d60: 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f  ees..**.** One o
6d70: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75  r both of the su
6d80: 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55  btrees can be NU
6d90: 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  LL.  Return a po
6da0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
6db0: 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  .** Expr node.  
6dc0: 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  Or, if an OOM er
6dd0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
6de0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
6df0: 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65  ocFailed,.** fre
6e00: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61  e the subtrees a
6e10: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
6e20: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6e30: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
6e40: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
6e50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6e60: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
6e90: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
6ea0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
6eb0: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
6ec0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
6ed0: 69 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20  ight            
6ee0: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
6ef0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
6f00: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
6f10: 4e 44 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  ND && pParse->nE
6f20: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  rr==0 ){.    /* 
6f30: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
6f40: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
6f50: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
6f60: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
6f70: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
6f80: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
6f90: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
6fa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
6fb0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6fc0: 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
6fd0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
6fe0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
6ff0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
7000: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
7010: 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f  .      p->op = o
7020: 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a  p & TKFLG_MASK;.
7030: 20 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20        p->iAgg = 
7040: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  -1;.    }.    sq
7050: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
7060: 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e  ubtrees(pParse->
7070: 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52  db, p, pLeft, pR
7080: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ight);.  }.  if(
7090: 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74   p ) {.    sqlit
70a0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
70b0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
70c0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ight);.  }.  ret
70d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
70e0: 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74  Add pSelect to t
70f0: 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  he Expr.x.pSelec
7100: 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66  t field.  Or, if
7110: 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28   pExpr is NULL (
7120: 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f  due.** do a memo
7130: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
7140: 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65  ilure) then dele
7150: 74 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f  te the pSelect o
7160: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
7170: 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
7180: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
7190: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
71a0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
71b0: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  ){.  if( pExpr )
71c0: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70  {.    pExpr->x.p
71d0: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
71e0: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  ;.    ExprSetPro
71f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7200: 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62  xIsSelect|EP_Sub
7210: 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  query);.    sqli
7220: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
7230: 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c  AndFlags(pParse,
7240: 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65   pExpr);.  }else
7250: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7260: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
7270: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
7280: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
7290: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
72a0: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  elect);.  }.}...
72b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
72c0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
72d0: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
72e0: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
72f0: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
7300: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
7310: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
7320: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
7330: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
7340: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
7350: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
7360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
7370: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
7380: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
7390: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
73a0: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
73b0: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
73c0: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
73d0: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
73e0: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
73f0: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
7400: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
7410: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
7420: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
7430: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
7440: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
7450: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
7460: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
7470: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
7480: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7490: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
74a0: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
74b0: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
74c0: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
74d0: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
74e0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
74f0: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
7500: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
7510: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
7520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
7530: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
7540: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
7550: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
7560: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
7570: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
7580: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
7590: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
75a0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
75b0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
75c0: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
75d0: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
75e0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
75f0: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7600: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7610: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
7620: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7630: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
7640: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
7650: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
7660: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
7670: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
7680: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
7690: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
76a0: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
76b0: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
76c0: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
76d0: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
76e0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
76f0: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
7700: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
7710: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
7720: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
7730: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
7740: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
7750: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
7760: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
7770: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
7780: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
7790: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
77a0: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
77b0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
77c0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
77d0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
77e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
77f0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
7800: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
7810: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
7820: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
7830: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
7840: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
7850: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
7860: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
7870: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7880: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
7890: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
78a0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
78b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
78c0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
78d0: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
78e0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
78f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
7900: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
7910: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7920: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
7930: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
7940: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
7950: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
7960: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
7970: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
7980: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
7990: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
79a0: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
79b0: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
79c0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
79d0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
79e0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 50  xprFunction(.  P
79f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7a00: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
7a10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
7a20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
7a30: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6c     /* Argument l
7a40: 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
7a50: 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f  pToken,        /
7a60: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75  * Name of the fu
7a70: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
7a80: 65 44 69 73 74 69 6e 63 74 20 20 20 20 20 20 20  eDistinct       
7a90: 20 20 2f 2a 20 53 46 5f 44 69 73 74 69 6e 63 74    /* SF_Distinct
7aa0: 20 6f 72 20 53 46 5f 41 4c 4c 20 6f 72 20 30 20   or SF_ALL or 0 
7ab0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
7ac0: 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ew;.  sqlite3 *d
7ad0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7ae0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
7af0: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
7b00: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
7b10: 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70  , TK_FUNCTION, p
7b20: 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28  Token, 1);.  if(
7b30: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
7b40: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7b50: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
7b60: 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72  ; /* Avoid memor
7b70: 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c  y leak when mall
7b80: 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  oc fails */.    
7b90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7ba0: 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
7bb0: 73 74 2d 3e 6e 45 78 70 72 20 3e 20 70 50 61 72  st->nExpr > pPar
7bc0: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
7bd0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
7be0: 54 49 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20 20  TION_ARG] ){.   
7bf0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7c00: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
7c10: 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20  ny arguments on 
7c20: 66 75 6e 63 74 69 6f 6e 20 25 54 22 2c 20 70 54  function %T", pT
7c30: 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  oken);.  }.  pNe
7c40: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
7c50: 73 74 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f  st;.  ExprSetPro
7c60: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 48  perty(pNew, EP_H
7c70: 61 73 46 75 6e 63 29 3b 0a 20 20 61 73 73 65 72  asFunc);.  asser
7c80: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
7c90: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
7ca0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
7cb0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
7cc0: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
7cd0: 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 65  , pNew);.  if( e
7ce0: 44 69 73 74 69 6e 63 74 3d 3d 53 46 5f 44 69 73  Distinct==SF_Dis
7cf0: 74 69 6e 63 74 20 29 20 45 78 70 72 53 65 74 50  tinct ) ExprSetP
7d00: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
7d10: 5f 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 72 65  _Distinct);.  re
7d20: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7d30: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
7d40: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
7d50: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
7d60: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
7d70: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
7d80: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
7d90: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
7da0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
7db0: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
7dc0: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
7dd0: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
7de0: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
7df0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
7e00: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
7e10: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
7e20: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
7e30: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
7e40: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
7e50: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69  n" is not too bi
7e60: 67 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e  g to avoid a den
7e70: 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61  ial of service a
7e80: 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68  ttack when.** th
7e90: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
7ea0: 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78  comes from an ex
7eb0: 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a  ternal source..*
7ec0: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
7ed0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
7ee0: 22 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24  ", "@aaa", or "$
7ef0: 61 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65  aaa" are assigne
7f00: 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  d the same numbe
7f10: 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76  r.** as the prev
7f20: 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66  ious instance of
7f30: 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61   the same wildca
7f40: 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20  rd.  Or if this 
7f50: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
7f60: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
7f70: 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65  wildcard, the ne
7f80: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61  xt sequential va
7f90: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73  riable number is
7fa0: 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f  .** assigned..*/
7fb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
7fc0: 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72  rAssignVarNumber
7fd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7fe0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32  Expr *pExpr, u32
7ff0: 20 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a   n){.  sqlite3 *
8000: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8010: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8020: 3b 0a 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20  ;.  ynVar x;..  
8030: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
8040: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
8050: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
8060: 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
8070: 61 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c  alue|EP_Reduced|
8080: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b  EP_TokenOnly) );
8090: 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e  .  z = pExpr->u.
80a0: 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  zToken;.  assert
80b0: 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( z!=0 );.  asse
80c0: 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20  rt( z[0]!=0 );. 
80d0: 20 61 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32   assert( n==(u32
80e0: 29 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  )sqlite3Strlen30
80f0: 28 7a 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31  (z) );.  if( z[1
8100: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ]==0 ){.    /* W
8110: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
8120: 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e  orm "?".  Assign
8130: 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62   the next variab
8140: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
8150: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27   assert( z[0]=='
8160: 3f 27 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79  ?' );.    x = (y
8170: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
8180: 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nVar);.  }else{.
8190: 20 20 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20      int doAdd = 
81a0: 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  0;.    if( z[0]=
81b0: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='?' ){.      /*
81c0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
81d0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43   form "?nnn".  C
81e0: 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20  onvert "nnn" to 
81f0: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20  an integer and. 
8200: 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61       ** use it a
8210: 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  s the variable n
8220: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  umber */.      i
8230: 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  64 i;.      int 
8240: 62 4f 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  bOk;.      if( n
8250: 3d 3d 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  ==2 ){ /*OPTIMIZ
8260: 41 54 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a  ATION-IF-TRUE*/.
8270: 20 20 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d          i = z[1]
8280: 2d 27 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f  -'0';  /* The co
8290: 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20  mmon case of ?N 
82a0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67  for a single dig
82b0: 69 74 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  it N */.        
82c0: 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  bOk = 1;.      }
82d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f  else{.        bO
82e0: 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74  k = 0==sqlite3At
82f0: 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20  oi64(&z[1], &i, 
8300: 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  n-1, SQLITE_UTF8
8310: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8320: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20   testcase( i==0 
8330: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8340: 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20  e( i==1 );.     
8350: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
8360: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8370: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8380: 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20  UMBER]-1 );.    
8390: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
83a0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
83b0: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
83c0: 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20  NUMBER] );.     
83d0: 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69   if( bOk==0 || i
83e0: 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d  <1 || i>db->aLim
83f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8400: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
8410: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8420: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8430: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
8440: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
8450: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
8460: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  ,.            db
8470: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8480: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8490: 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20  UMBER]);.       
84a0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
84b0: 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61  .      x = (ynVa
84c0: 72 29 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78  r)i;.      if( x
84d0: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
84e0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
84f0: 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a  >nVar = (int)x;.
8500: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
8510: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
8520: 66 28 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  f( sqlite3VListN
8530: 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d  umToName(pParse-
8540: 3e 70 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29  >pVList, x)==0 )
8550: 7b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64 20  {.        doAdd 
8560: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
8570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
8580: 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20   Wildcards like 
8590: 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f  ":aaa", "$aaa" o
85a0: 72 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65  r "@aaa".  Reuse
85b0: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
85c0: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  le.      ** numb
85d0: 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20  er as the prior 
85e0: 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68  appearance of th
85f0: 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20  e same name, or 
8600: 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20  if the name.    
8610: 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61    ** has never a
8620: 70 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20  ppeared before, 
8630: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  reuse the same v
8640: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20  ariable number. 
8650: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20       */.      x 
8660: 3d 20 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33  = (ynVar)sqlite3
8670: 56 4c 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70  VListNameToNum(p
8680: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a  Parse->pVList, z
8690: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
86a0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
86b0: 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  x = (ynVar)(++pP
86c0: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
86d0: 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a       doAdd = 1;.
86e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
86f0: 20 20 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20    if( doAdd ){. 
8700: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c       pParse->pVL
8710: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69  ist = sqlite3VLi
8720: 73 74 41 64 64 28 64 62 2c 20 70 50 61 72 73 65  stAdd(db, pParse
8730: 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20  ->pVList, z, n, 
8740: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  x);.    }.  }.  
8750: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
8760: 20 78 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e   x;.  if( x>db->
8770: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8780: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
8790: 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  BER] ){.    sqli
87a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
87b0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51  se, "too many SQ
87c0: 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20  L variables");. 
87d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75   }.}../*.** Recu
87e0: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
87f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
8800: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
8810: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
8820: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
8830: 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64  eteNN(sqlite3 *d
8840: 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61  b, Expr *p){.  a
8850: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
8860: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
8870: 3a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  : Assert that th
8880: 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f  e IntValue is no
8890: 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69 74  n-negative if it
88a0: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73   exists */.  ass
88b0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
88c0: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
88d0: 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56  alue) || p->u.iV
88e0: 61 6c 75 65 3e 3d 30 20 29 3b 0a 23 69 66 64 65  alue>=0 );.#ifde
88f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8900: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8910: 65 72 74 79 28 70 2c 20 45 50 5f 4c 65 61 66 29  erty(p, EP_Leaf)
8920: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
8930: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8940: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73  Only) ){.    ass
8950: 65 72 74 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30  ert( p->pLeft==0
8960: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8970: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
8980: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78      assert( p->x
8990: 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  .pSelect==0 );. 
89a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
89b0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
89c0: 28 70 2c 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  (p, (EP_TokenOnl
89d0: 79 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20  y|EP_Leaf)) ){. 
89e0: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
89f0: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
8a00: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
8a10: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
8a20: 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ight */.    asse
8a30: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
8a40: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
8a50: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
8a60: 70 4c 65 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d  pLeft && p->op!=
8a70: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
8a80: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
8a90: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c  leteNN(db, p->pL
8aa0: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  eft);.    if( p-
8ab0: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
8ac0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8ad0: 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 52 69 67  teNN(db, p->pRig
8ae0: 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ht);.    }else i
8af0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8b00: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
8b10: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
8b20: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
8b30: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
8b40: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
8b50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8b60: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
8b70: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
8b80: 7d 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  }.    if( !ExprH
8b90: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8ba0: 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20  _Reduced) ){.   
8bb0: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
8bc0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57  Delete(db, p->pW
8bd0: 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  in);.    }.  }. 
8be0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8bf0: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
8c00: 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62  ken) ) sqlite3Db
8c10: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
8c20: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 45 78  oken);.  if( !Ex
8c30: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8c40: 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20   EP_Static) ){. 
8c50: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8c60: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  NN(db, p);.  }.}
8c70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
8c80: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
8c90: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
8ca0: 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33   if( p ) sqlite3
8cb0: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8cc0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
8cd0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8ce0: 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
8cf0: 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ed for the expre
8d00: 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20  ssion structure 
8d10: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
8d20: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8d30: 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
8d40: 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c   one of EXPR_FUL
8d50: 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52  LSIZE,.** EXPR_R
8d60: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58  EDUCEDSIZE or EX
8d70: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8d80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8d90: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  exprStructSize(E
8da0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45  xpr *p){.  if( E
8db0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8dc0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
8dd0: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f  ) return EXPR_TO
8de0: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69  KENONLYSIZE;.  i
8df0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8e00: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
8e10: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
8e20: 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72  REDUCEDSIZE;.  r
8e30: 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53  eturn EXPR_FULLS
8e40: 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  IZE;.}../*.** Th
8e50: 65 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65  e dupedExpr*Size
8e60: 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68  () routines each
8e70: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
8e80: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
8e90: 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ired.** to store
8ea0: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
8eb0: 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72  pression or expr
8ec0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68  ession tree.  Th
8ed0: 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20  ey differ in.** 
8ee0: 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20  how much of the 
8ef0: 74 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64  tree is measured
8f00: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65  ..**.**     dupe
8f10: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
8f20: 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e  )     Size of on
8f30: 6c 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75  ly the Expr stru
8f40: 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75  cture .**     du
8f50: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
8f60: 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20  )       Size of 
8f70: 45 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72  Expr + space for
8f80: 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75   token.**     du
8f90: 70 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20  pedExprSize()   
8fa0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74          Expr + t
8fb0: 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63  oken + subtree c
8fc0: 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a  omponents.**.***
8fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9010: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
9020: 68 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75  he dupedExprStru
9030: 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f  ctSize() functio
9040: 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61  n returns two va
9050: 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74  lues OR-ed toget
9060: 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68  her:  .** (1) th
9070: 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  e space required
9080: 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74   for a copy of t
9090: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
90a0: 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28  e only and .** (
90b0: 32 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c  2) the EP_xxx fl
90c0: 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74  ags that indicat
90d0: 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63  e what the struc
90e0: 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64  ture size should
90f0: 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75   be..** The retu
9100: 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77  rn values is alw
9110: 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a  ays one of:.**.*
9120: 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c  *      EXPR_FULL
9130: 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50  SIZE.**      EXP
9140: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20  R_REDUCEDSIZE   
9150: 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20  | EP_Reduced.** 
9160: 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f       EXPR_TOKENO
9170: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
9180: 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65  enOnly.**.** The
9190: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72   size of the str
91a0: 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f  ucture can be fo
91b0: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
91c0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
91d0: 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ** of this routi
91e0: 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20  ne with 0xfff.  
91f0: 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65  The flags can be
9200: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
9210: 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20  g the.** return 
9220: 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65  value with EP_Re
9230: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
9240: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ly..**.** Note t
9250: 68 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d  hat with flags==
9260: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
9270: 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f  this routines wo
9280: 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65  rks on full-size
9290: 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20  .** (unreduced) 
92a0: 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20  Expr objects as 
92b0: 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c  they or original
92c0: 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ly constructed b
92d0: 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a  y the parser..**
92e0: 20 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69   During expressi
92f0: 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74  on analysis, ext
9300: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
9310: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d  s computed and m
9320: 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74  oved into.** lat
9330: 65 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  er parts of the 
9340: 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  Expr object and 
9350: 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72  that extra infor
9360: 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74  mation might get
9370: 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20   chopped.** off 
9380: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
9390: 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e  n is reduced.  N
93a0: 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74  ote also that it
93b0: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74   does not work t
93c0: 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50  o.** make an EXP
93d0: 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79  RDUP_REDUCE copy
93e0: 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78   of a reduced ex
93f0: 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73  pression.  It is
9400: 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74   only legal.** t
9410: 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74  o reduce a prist
9420: 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ine expression t
9430: 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ree from the par
9440: 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d  ser.  The implem
9450: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64  entation.** of d
9460: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
9470: 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c  ze() contain mul
9480: 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73  tiple assert() s
9490: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61  tatements that a
94a0: 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66  ttempt.** to enf
94b0: 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72  orce this constr
94c0: 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aint..*/.static 
94d0: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72  int dupedExprStr
94e0: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  uctSize(Expr *p,
94f0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
9500: 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65  nt nSize;.  asse
9510: 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  rt( flags==EXPRD
9520: 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61  UP_REDUCE || fla
9530: 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79  gs==0 ); /* Only
9540: 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20   one flag value 
9550: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73  allowed */.  ass
9560: 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49  ert( EXPR_FULLSI
9570: 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61  ZE<=0xfff );.  a
9580: 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20  ssert( (0xfff & 
9590: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
95a0: 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b  okenOnly))==0 );
95b0: 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20  .  if( 0==flags 
95c0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  || p->op==TK_SEL
95d0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 0a 23 69 66 6e  ECT_COLUMN .#ifn
95e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
95f0: 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 7c 7c  WINDOWFUNC.   ||
9600: 20 70 2d 3e 70 57 69 6e 20 0a 23 65 6e 64 69 66   p->pWin .#endif
9610: 0a 20 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  .  ){.    nSize 
9620: 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  = EXPR_FULLSIZE;
9630: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
9640: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
9650: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
9660: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
9670: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
9680: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9690: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
96a0: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
96b0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
96c0: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
96d0: 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  en) );.    asser
96e0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
96f0: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
9700: 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ce) );.    if( p
9710: 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e  ->pLeft || p->x.
9720: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
9730: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
9740: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
9750: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
9760: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9770: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
9780: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
9790: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20  R_TOKENONLYSIZE 
97a0: 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  | EP_TokenOnly;.
97b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
97c0: 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nSize;.}../*.
97d0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
97e0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61   returns the spa
97f0: 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75  ce in bytes requ
9800: 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
9810: 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68  e copy .** of th
9820: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
9830: 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
9840: 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  he Expr.u.zToken
9850: 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74   string (if that
9860: 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65  .** string is de
9870: 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  fined.).*/.stati
9880: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e  c int dupedExprN
9890: 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  odeSize(Expr *p,
98a0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
98b0: 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64  nt nByte = duped
98c0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
98d0: 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66  , flags) & 0xfff
98e0: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
98f0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
9900: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
9910: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e  .zToken ){.    n
9920: 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
9930: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
9940: 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65  ken)+1;.  }.  re
9950: 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74  turn ROUND8(nByt
9960: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
9970: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
9980: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
9990: 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70   to create a dup
99a0: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a  licate of the .*
99b0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  * expression pas
99c0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
99d0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73   argument. The s
99e0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
99f0: 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74  s a.** mask cont
9a00: 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58  aining EXPRDUP_X
9a10: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  XX flags..**.** 
9a20: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
9a30: 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63  ed includes spac
9a40: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  e to create a co
9a50: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
9a60: 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20  truct.** itself 
9a70: 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72  and the buffer r
9a80: 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78  eferred to by Ex
9a90: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20  pr.u.zToken, if 
9aa0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  any..**.** If th
9ab0: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
9ac0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
9ad0: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
9ae0: 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a  lue includes .**
9af0: 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63   space to duplic
9b00: 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64  ate all Expr nod
9b10: 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66  es in the tree f
9b20: 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c  ormed by Expr.pL
9b30: 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72  eft .** and Expr
9b40: 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65  .pRight variable
9b50: 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61  s (but not for a
9b60: 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f  ny structures po
9b70: 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20  inted to or .** 
9b80: 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74  descended from t
9b90: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
9ba0: 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  or Expr.x.pSelec
9bb0: 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f  t variables)..*/
9bc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
9bd0: 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a  dExprSize(Expr *
9be0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
9bf0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a   int nByte = 0;.
9c00: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e    if( p ){.    n
9c10: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
9c20: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67  NodeSize(p, flag
9c30: 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  s);.    if( flag
9c40: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
9c50: 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20   ){.      nByte 
9c60: 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  += dupedExprSize
9c70: 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73  (p->pLeft, flags
9c80: 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a  ) + dupedExprSiz
9c90: 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61  e(p->pRight, fla
9ca0: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
9cb0: 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d   return nByte;.}
9cc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9cd0: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
9ce0: 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44   to sqlite3ExprD
9cf0: 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  up(), except tha
9d00: 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a  t if pzBuffer .*
9d10: 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  * is not NULL th
9d20: 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  en *pzBuffer is 
9d30: 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
9d40: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72   to a buffer lar
9d50: 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f  ge enough .** to
9d60: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
9d70: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c  of expression p,
9d80: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70   the copies of p
9d90: 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69  ->u.zToken.** (i
9da0: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61  f applicable), a
9db0: 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  nd the copies of
9dc0: 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e   the p->pLeft an
9dd0: 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72  d p->pRight expr
9de0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61  essions,.** if a
9df0: 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  ny. Before retur
9e00: 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20  ning, *pzBuffer 
9e10: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69  is set to the fi
9e20: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
9e30: 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20  e.** portion of 
9e40: 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65  the buffer copie
9e50: 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66  d into by this f
9e60: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
9e70: 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70  ic Expr *exprDup
9e80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
9e90: 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c  pr *p, int dupFl
9ea0: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
9eb0: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
9ec0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
9ed0: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
9ee0: 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b  */.  u8 *zAlloc;
9ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
9f00: 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20  mory space from 
9f10: 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45  which to build E
9f20: 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  xpr object */.  
9f30: 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20  u32 staticFlag; 
9f40: 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74        /* EP_Stat
9f50: 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20  ic if space not 
9f60: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
9f70: 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72  lloc */..  asser
9f80: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
9f90: 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73  sert( p );.  ass
9fa0: 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30  ert( dupFlags==0
9fb0: 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58   || dupFlags==EX
9fc0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a  PRDUP_REDUCE );.
9fd0: 20 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66    assert( pzBuff
9fe0: 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67  er==0 || dupFlag
9ff0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
a000: 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  E );..  /* Figur
a010: 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77  e out where to w
a020: 72 69 74 65 20 74 68 65 20 6e 65 77 20 45 78 70  rite the new Exp
a030: 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  r structure. */.
a040: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
a050: 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a  {.    zAlloc = *
a060: 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74  pzBuffer;.    st
a070: 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74  aticFlag = EP_St
a080: 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  atic;.  }else{. 
a090: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69     zAlloc = sqli
a0a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
a0b0: 28 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69  (db, dupedExprSi
a0c0: 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29  ze(p, dupFlags))
a0d0: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
a0e0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
a0f0: 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f   = (Expr *)zAllo
a100: 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29  c;..  if( pNew )
a110: 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65  {.    /* Set nNe
a120: 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  wSize to the siz
a130: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
a140: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  the structure po
a150: 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  inted to.    ** 
a160: 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73  by pNew. This is
a170: 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c   either EXPR_FUL
a180: 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55  LSIZE, EXPR_REDU
a190: 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a  CEDSIZE or.    *
a1a0: 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  * EXPR_TOKENONLY
a1b0: 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20  SIZE. nToken is 
a1c0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
a1d0: 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75  r of bytes consu
a1e0: 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  med.    ** by th
a1f0: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d  e copy of the p-
a200: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
a210: 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
a220: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  /.    const unsi
a230: 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65  gned nStructSize
a240: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
a250: 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  ctSize(p, dupFla
a260: 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  gs);.    const i
a270: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
a280: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
a290: 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  f;.    int nToke
a2a0: 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  n;.    if( !Expr
a2b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
a2c0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
a2d0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
a2e0: 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c      nToken = sql
a2f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
a300: 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20  u.zToken) + 1;. 
a310: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a320: 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nToken = 0;.    
a330: 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c 61  }.    if( dupFla
a340: 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gs ){.      asse
a350: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
a360: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
a370: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d  d)==0 );.      m
a380: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
a390: 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20   nNewSize);.    
a3a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32  }else{.      u32
a3b0: 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78   nSize = (u32)ex
a3c0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
a3d0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
a3e0: 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b  lloc, p, nSize);
a3f0: 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65  .      if( nSize
a400: 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29  <EXPR_FULLSIZE )
a410: 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  { .        memse
a420: 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d  t(&zAlloc[nSize]
a430: 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49  , 0, EXPR_FULLSI
a440: 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  ZE-nSize);.     
a450: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a460: 20 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75   Set the EP_Redu
a470: 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ced, EP_TokenOnl
a480: 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63  y, and EP_Static
a490: 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61   flags appropria
a4a0: 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65  tely. */.    pNe
a4b0: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
a4c0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
a4d0: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c  nOnly|EP_Static|
a4e0: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20  EP_MemToken);.  
a4f0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
a500: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28   nStructSize & (
a510: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
a520: 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e  kenOnly);.    pN
a530: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61  ew->flags |= sta
a540: 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a  ticFlag;..    /*
a550: 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a   Copy the p->u.z
a560: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66  Token string, if
a570: 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
a580: 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   nToken ){.     
a590: 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20   char *zToken = 
a5a0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
a5b0: 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b   (char*)&zAlloc[
a5c0: 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20  nNewSize];.     
a5d0: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
a5e0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
a5f0: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ken);.    }..   
a600: 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61   if( 0==((p->fla
a610: 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20  gs|pNew->flags) 
a620: 26 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  & (EP_TokenOnly|
a630: 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20  EP_Leaf)) ){.   
a640: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
a650: 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63  e pNew->x.pSelec
a660: 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69  t or pNew->x.pLi
a670: 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20  st member. */.  
a680: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
a690: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
a6a0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
a6b0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
a6c0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
a6d0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
a6e0: 70 53 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67  pSelect, dupFlag
a6f0: 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s);.      }else{
a700: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
a710: 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  .pList = sqlite3
a720: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
a730: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46  p->x.pList, dupF
a740: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lags);.      }. 
a750: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c     }..    /* Fil
a760: 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74  l in pNew->pLeft
a770: 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68   and pNew->pRigh
a780: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78  t. */.    if( Ex
a790: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
a7a0: 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ew, EP_Reduced|E
a7b0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
a7c0: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20        zAlloc += 
a7d0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
a7e0: 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  e(p, dupFlags);.
a7f0: 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48        if( !ExprH
a800: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
a810: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
a820: 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  _Leaf) ){.      
a830: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
a840: 70 2d 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20 20  p->pLeft ?.     
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a860: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
a870: 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52  pLeft, EXPRDUP_R
a880: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20  EDUCE, &zAlloc) 
a890: 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  : 0;.        pNe
a8a0: 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e 70  w->pRight = p->p
a8b0: 52 69 67 68 74 20 3f 0a 20 20 20 20 20 20 20 20  Right ?.        
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
a8d0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
a8e0: 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45  ight, EXPRDUP_RE
a8f0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a  DUCE, &zAlloc) :
a900: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
a910: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
a920: 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66  {.        *pzBuf
a930: 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20  fer = zAlloc;.  
a940: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
a950: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a960: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
a970: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
a980: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
a990: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a9a0: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
a9b0: 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b   pNew->pWin = 0;
a9c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a9d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e        pNew->pWin
a9e0: 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77   = sqlite3Window
a9f0: 44 75 70 28 64 62 2c 20 70 4e 65 77 2c 20 70 2d  Dup(db, pNew, p-
aa00: 3e 70 57 69 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  >pWin);.      }.
aa10: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
aa20: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
aa30: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 45   */.      if( !E
aa40: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
aa50: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
aa60: 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20  P_Leaf) ){.     
aa70: 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d     if( pNew->op=
aa80: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
aa90: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  N ){.          p
aaa0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e  New->pLeft = p->
aab0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
aac0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c   assert( p->iCol
aad0: 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  umn==0 || p->pRi
aae0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
aaf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
ab00: 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e  Right==0  || p->
ab10: 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74  pRight==p->pLeft
ab20: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
ab30: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
ab40: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
ab50: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
ab60: 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
ab70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e      }.        pN
ab80: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
ab90: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
aba0: 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  p->pRight, 0);. 
abb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
abc0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
abd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
abe0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65  and return a dee
abf0: 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62  p copy of the ob
ac00: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
ac10: 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72  he second .** ar
ac20: 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f  gument. If an OO
ac30: 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65  M condition is e
ac40: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c  ncountered, NULL
ac50: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
ac60: 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  and the db->mall
ac70: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65  ocFailed flag se
ac80: 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
ac90: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74  LITE_OMIT_CTE.st
aca0: 61 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44  atic With *withD
acb0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
acc0: 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68  With *p){.  With
acd0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
ace0: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ( p ){.    int n
acf0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
ad00: 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  ) + sizeof(p->a[
ad10: 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31  0]) * (p->nCte-1
ad20: 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  );.    pRet = sq
ad30: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
ad40: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
ad50: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
ad60: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
ad70: 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d   pRet->nCte = p-
ad80: 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72  >nCte;.      for
ad90: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b  (i=0; i<p->nCte;
ada0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
adb0: 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Ret->a[i].pSelec
adc0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
add0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
ade0: 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
adf0: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
ae00: 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33  .pCols = sqlite3
ae10: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
ae20: 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30  p->a[i].pCols, 0
ae30: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
ae40: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
ae50: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
ae60: 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
ae70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ae80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
ae90: 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
aea0: 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29  ine withDup(x,y)
aeb0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
aec0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
aed0: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
aee0: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
aef0: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
af00: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
af10: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
af20: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
af30: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
af40: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
af50: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
af60: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
af70: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
af80: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
af90: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
afa0: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
afb0: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
afc0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
afd0: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
afe0: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
aff0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
b000: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
b010: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
b020: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
b030: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
b040: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
b050: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
b060: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
b070: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
b080: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
b090: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
b0a0: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
b0b0: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
b0c0: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a  t duplicated..**
b0d0: 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
b0e0: 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73  rameter contains
b0f0: 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
b100: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58  f the EXPRDUP_XX
b110: 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74  X flags..** If t
b120: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
b130: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
b140: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
b150: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a  e returned is a.
b160: 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72  ** truncated ver
b170: 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61  sion of the usua
b180: 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  l Expr structure
b190: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74   that will be st
b1a0: 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  ored as.** part 
b1b0: 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
b1c0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
b1d0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
b1e0: 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20  schema..*/.Expr 
b1f0: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
b200: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
b210: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
b220: 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  {.  assert( flag
b230: 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45  s==0 || flags==E
b240: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b  XPRDUP_REDUCE );
b250: 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20 65 78  .  return p ? ex
b260: 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61  prDup(db, p, fla
b270: 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a 45 78  gs, 0) : 0;.}.Ex
b280: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
b290: 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74  xprListDup(sqlit
b2a0: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
b2b0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
b2c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65  .  ExprList *pNe
b2d0: 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  w;.  struct Expr
b2e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
b2f0: 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69  , *pOldItem;.  i
b300: 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 50  nt i;.  Expr *pP
b310: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20  riorSelectCol = 
b320: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  0;.  assert( db!
b330: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
b340: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b350: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
b360: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
b370: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
b380: 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20 20 69 66  ze(db, p));.  if
b390: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
b3a0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45  rn 0;.  pNew->nE
b3b0: 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  xpr = p->nExpr;.
b3c0: 20 20 70 49 74 65 6d 20 3d 20 70 4e 65 77 2d 3e    pItem = pNew->
b3d0: 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20  a;.  pOldItem = 
b3e0: 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p->a;.  for(i=0;
b3f0: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
b400: 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49  , pItem++, pOldI
b410: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
b420: 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c   *pOldExpr = pOl
b430: 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  dItem->pExpr;.  
b440: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
b450: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
b460: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
b470: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
b480: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
b490: 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20 20 20  ( pOldExpr .    
b4a0: 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e 6f 70   && pOldExpr->op
b4b0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  ==TK_SELECT_COLU
b4c0: 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e 65 77  MN.     && (pNew
b4d0: 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Expr = pItem->pE
b4e0: 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  xpr)!=0 .    ){.
b4f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
b500: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
b510: 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20 20 20  =0 || i>0 );.   
b520: 20 20 20 69 66 28 20 70 4e 65 77 45 78 70 72 2d     if( pNewExpr-
b530: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20  >iColumn==0 ){. 
b540: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b550: 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  OldExpr->pLeft==
b560: 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67 68 74  pOldExpr->pRight
b570: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
b580: 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 70 4e  orSelectCol = pN
b590: 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ewExpr->pLeft = 
b5a0: 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67 68 74  pNewExpr->pRight
b5b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b5c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
b5d0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
b5e0: 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31 5d 2e  sert( pItem[-1].
b5f0: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
b600: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
b610: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
b620: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e  Item[-1].pExpr->
b630: 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 20  iColumn+1 );.   
b640: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
b650: 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d 70 49  iorSelectCol==pI
b660: 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 70  tem[-1].pExpr->p
b670: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Left );.        
b680: 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20  pNewExpr->pLeft 
b690: 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f  = pPriorSelectCo
b6a0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
b6b0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
b6c0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
b6d0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b6e0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  ->zName);.    pI
b6f0: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
b700: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b710: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e   pOldItem->zSpan
b720: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
b730: 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74  rtOrder = pOldIt
b740: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
b750: 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d     pItem->done =
b760: 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62   0;.    pItem->b
b770: 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64  SpanIsTab = pOld
b780: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
b790: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f  ;.    pItem->bSo
b7a0: 72 74 65 72 52 65 66 20 3d 20 70 4f 6c 64 49 74  rterRef = pOldIt
b7b0: 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 3b 0a  em->bSorterRef;.
b7c0: 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70      pItem->u = p
b7d0: 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a  OldItem->u;.  }.
b7e0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
b7f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
b800: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
b810: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
b820: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
b830: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
b840: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
b850: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
b860: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
b870: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
b880: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
b890: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
b8a0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
b8b0: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
b8c0: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
b8d0: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
b8e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
b8f0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
b900: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
b910: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
b920: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
b930: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
b940: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
b950: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
b960: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
b970: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
b980: 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  gs){.  SrcList *
b990: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
b9a0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61 73   int nByte;.  as
b9b0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
b9c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b9d0: 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20  rn 0;.  nByte = 
b9e0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d  sizeof(*p) + (p-
b9f0: 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66  >nSrc>0 ? sizeof
ba00: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
ba10: 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20  nSrc-1) : 0);.  
ba20: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
ba30: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
ba40: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
ba50: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
ba60: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20  0;.  pNew->nSrc 
ba70: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
ba80: 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28   p->nSrc;.  for(
ba90: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20  i=0; i<p->nSrc; 
baa0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
bab0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
bac0: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
bad0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
bae0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
baf0: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
bb00: 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  [i];.    Table *
bb10: 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74  pTab;.    pNewIt
bb20: 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f  em->pSchema = pO
bb30: 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b  ldItem->pSchema;
bb40: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
bb50: 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
bb60: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
bb70: 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  OldItem->zDataba
bb80: 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  se);.    pNewIte
bb90: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
bba0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
bbb0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
bbc0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
bbd0: 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44  Alias = sqlite3D
bbe0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bbf0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
bc00: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20     pNewItem->fg 
bc10: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a  = pOldItem->fg;.
bc20: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
bc30: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
bc40: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
bc50: 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  NewItem->addrFil
bc60: 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  lSub = pOldItem-
bc70: 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20  >addrFillSub;.  
bc80: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52    pNewItem->regR
bc90: 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d  eturn = pOldItem
bca0: 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20  ->regReturn;.   
bcb0: 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66   if( pNewItem->f
bcc0: 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b  g.isIndexedBy ){
bcd0: 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  .      pNewItem-
bce0: 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d  >u1.zIndexedBy =
bcf0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
bd00: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75  (db, pOldItem->u
bd10: 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20  1.zIndexedBy);. 
bd20: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65     }.    pNewIte
bd30: 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 4f  m->pIBIndex = pO
bd40: 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78  ldItem->pIBIndex
bd50: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74  ;.    if( pNewIt
bd60: 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
bd70: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74   ){.      pNewIt
bd80: 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20  em->u1.pFuncArg 
bd90: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
bda0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
bdb0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31  db, pOldItem->u1
bdc0: 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67 73  .pFuncArg, flags
bdd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  );.    }.    pTa
bde0: 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54  b = pNewItem->pT
bdf0: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ab = pOldItem->p
be00: 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
be10: 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  b ){.      pTab-
be20: 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
be30: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
be40: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
be50: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
be60: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
be70: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
be80: 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71  ewItem->pOn = sq
be90: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
bea0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20   pOldItem->pOn, 
beb0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
bec0: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73  Item->pUsing = s
bed0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
bee0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55  db, pOldItem->pU
bef0: 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49  sing);.    pNewI
bf00: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70  tem->colUsed = p
bf10: 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  OldItem->colUsed
bf20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
bf30: 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73  New;.}.IdList *s
bf40: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
bf50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
bf60: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
bf70: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
bf80: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
bf90: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
bfa0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
bfb0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
bfc0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
bfd0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
bfe0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
bff0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
c000: 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20  >nId = p->nId;. 
c010: 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74   pNew->a = sqlit
c020: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
c030: 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f  db, p->nId*sizeo
c040: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
c050: 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29  if( pNew->a==0 )
c060: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
c070: 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b  reeNN(db, pNew);
c080: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c090: 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61   }.  /* Note tha
c0a0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69  t because the si
c0b0: 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ze of the alloca
c0c0: 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20  tion for p->a[] 
c0d0: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65  is not.  ** nece
c0e0: 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20  ssarily a power 
c0f0: 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49  of two, sqlite3I
c100: 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61  dListAppend() ma
c110: 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a  y not be called.
c120: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c    ** on the dupl
c130: 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79  icate created by
c140: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
c150: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
c160: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
c170: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
c180: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
c190: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
c1a0: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
c1b0: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
c1c0: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
c1d0: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
c1e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
c1f0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
c200: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
c210: 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49  tem->idx = pOldI
c220: 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20  tem->idx;.  }.  
c230: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53  return pNew;.}.S
c240: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
c250: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
c260: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 44 75  *db, Select *pDu
c270: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
c280: 20 53 65 6c 65 63 74 20 2a 70 52 65 74 20 3d 20   Select *pRet = 
c290: 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  0;.  Select *pNe
c2a0: 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74  xt = 0;.  Select
c2b0: 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 20   **pp = &pRet;. 
c2c0: 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61   Select *p;..  a
c2d0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
c2e0: 20 20 66 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b    for(p=pDup; p;
c2f0: 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20   p=p->pPrior){. 
c300: 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 20     Select *pNew 
c310: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c320: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
c330: 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 69 66 28  f(*p) );.    if(
c340: 20 70 4e 65 77 3d 3d 30 20 29 20 62 72 65 61 6b   pNew==0 ) break
c350: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69  ;.    pNew->pELi
c360: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
c370: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
c380: 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20  EList, flags);. 
c390: 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20     pNew->pSrc = 
c3a0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
c3b0: 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66  p(db, p->pSrc, f
c3c0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
c3d0: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
c3e0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
c3f0: 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a  pWhere, flags);.
c400: 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70      pNew->pGroup
c410: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
c420: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
c430: 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b  GroupBy, flags);
c440: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  .    pNew->pHavi
c450: 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
c460: 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  Dup(db, p->pHavi
c470: 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ng, flags);.    
c480: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
c490: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c4a0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
c4b0: 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  rBy, flags);.   
c4c0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f   pNew->op = p->o
c4d0: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65  p;.    pNew->pNe
c4e0: 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20  xt = pNext;.    
c4f0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pNew->pPrior = 0
c500: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  ;.    pNew->pLim
c510: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
c520: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
c530: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
c540: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  New->iLimit = 0;
c550: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  .    pNew->iOffs
c560: 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  et = 0;.    pNew
c570: 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  ->selFlags = p->
c580: 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55  selFlags & ~SF_U
c590: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
c5a0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
c5b0: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
c5c0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
c5d0: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
c5e0: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
c5f0: 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow = p->nSelectR
c600: 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57  ow;.    pNew->pW
c610: 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62  ith = withDup(db
c620: 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 23 69 66  , p->pWith);.#if
c630: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c640: 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20  _WINDOWFUNC.    
c650: 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a  pNew->pWin = 0;.
c660: 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65      pNew->pWinDe
c670: 66 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  fn = sqlite3Wind
c680: 6f 77 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  owListDup(db, p-
c690: 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 23 65 6e 64  >pWinDefn);.#end
c6a0: 69 66 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c  if.    pNew->sel
c6b0: 49 64 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a 20  Id = p->selId;. 
c6c0: 20 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20     *pp = pNew;. 
c6d0: 20 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70     pp = &pNew->p
c6e0: 50 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74  Prior;.    pNext
c6f0: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20   = pNew;.  }..  
c700: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
c710: 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c  else.Select *sql
c720: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
c730: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
c740: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
c750: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
c760: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
c770: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
c780: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
c790: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
c7a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
c7b0: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
c7c0: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
c7d0: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
c7e0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
c7f0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  n list..**.** Th
c800: 65 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74  e pList argument
c810: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
c820: 4e 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65  NULL or a pointe
c830: 72 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74  r to an ExprList
c840: 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  .** obtained fro
c850: 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  m a prior call t
c860: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  o sqlite3ExprLis
c870: 74 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73  tAppend().  This
c880: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20   routine.** may 
c890: 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
c8a0: 20 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74   an ExprList obt
c8b0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
c8c0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e  e3ExprListDup().
c8d0: 0a 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69  .** Reason:  Thi
c8e0: 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65  s routine assume
c8f0: 73 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  s that the numbe
c900: 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c  r of slots in pL
c910: 69 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61  ist->a[].** is a
c920: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20   power of two.  
c930: 54 68 61 74 20 69 73 20 74 72 75 65 20 66 6f 72  That is true for
c940: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c950: 41 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73  Append() returns
c960: 0a 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e  .** but is not n
c970: 65 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20  ecessarily true 
c980: 66 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20  from the return 
c990: 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
c9a0: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a  ExprListDup()..*
c9b0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
c9c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
c9d0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e  r occurs, the en
c9e0: 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65  tire list is fre
c9f0: 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69  ed and.** NULL i
ca00: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
ca10: 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75  non-NULL is retu
ca20: 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  rned, then it is
ca30: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
ca40: 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hat the new entr
ca50: 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  y was successful
ca60: 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  ly appended..*/.
ca70: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
ca80: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
ca90: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
caa0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
cab0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
cac0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
cad0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
cae0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
caf0: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
cb00: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
cb10: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
cb20: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
cb30: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
cb40: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
cb50: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
cb60: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
cb70: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
cb80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
cb90: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
cba0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
cbb0: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
cbc0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
cbd0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
cbe0: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
cbf0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
cc00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
cc10: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
cc20: 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a  ist->nExpr = 0;.
cc30: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69    }else if( (pLi
cc40: 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69  st->nExpr & (pLi
cc50: 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30  st->nExpr-1))==0
cc60: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
cc70: 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77   *pNew;.    pNew
cc80: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
cc90: 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a  loc(db, pList, .
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
ccb0: 65 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70  eof(*pList)+(2*p
ccc0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29  List->nExpr - 1)
ccd0: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
cce0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70  [0]));.    if( p
ccf0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
cd00: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
cd10: 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70   }.    pList = p
cd20: 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  New;.  }.  pItem
cd30: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
cd40: 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20  st->nExpr++];.  
cd50: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66  assert( offsetof
cd60: 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74  (struct ExprList
cd70: 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69  _item,zName)==si
cd80: 7a 65 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70  zeof(pItem->pExp
cd90: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
cda0: 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20  offsetof(struct 
cdb0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45  ExprList_item,pE
cdc0: 78 70 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d  xpr)==0 );.  mem
cdd0: 73 65 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d  set(&pItem->zNam
cde0: 65 2c 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65  e,0,sizeof(*pIte
cdf0: 6d 29 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75  m)-offsetof(stru
ce00: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
ce10: 2c 7a 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65  ,zName));.  pIte
ce20: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
ce30: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
ce40: 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a  ;..no_mem:     .
ce50: 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69    /* Avoid leaki
ce60: 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c  ng memory if mal
ce70: 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20  loc has failed. 
ce80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
ce90: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
cea0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
ceb0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
cec0: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
ced0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c  0;.}../*.** pCol
cee0: 75 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66  umns and pExpr f
cef0: 6f 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73  orm a vector ass
cf00: 69 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73  ignment which is
cf10: 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 54   part of the SET
cf20: 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e  .** clause of an
cf30: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
cf40: 74 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  t.  Like this:.*
cf50: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62  *.**        (a,b
cf60: 2c 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70  ,c) = (expr1,exp
cf70: 72 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a  r2,expr3).** Or:
cf80: 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53      (a,b,c) = (S
cf90: 45 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d  ELECT x,y,z FROM
cfa0: 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72   ....).**.** For
cfb0: 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68   each term of th
cfc0: 65 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d  e vector assignm
cfd0: 65 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20  ent, append new 
cfe0: 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a  entries to the.*
cff0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
d000: 74 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65  t pList.  In the
d010: 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 71 75   case of a subqu
d020: 65 72 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20  ery on the RHS, 
d030: 61 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c  append.** TK_SEL
d040: 45 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65  ECT_COLUMN expre
d050: 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c  ssions..*/.ExprL
d060: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
d070: 4c 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72  ListAppendVector
d080: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d090: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
d0a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d0b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d0c0: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st,       /* Lis
d0d0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
d0e0: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
d0f0: 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  ULL */.  IdList 
d100: 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20  *pColumns,      
d110: 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73  /* List of names
d120: 20 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61   of LHS of the a
d130: 73 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45  ssignment */.  E
d140: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
d150: 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20        /* Vector 
d160: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
d170: 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74   appended. Might
d180: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
d190: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d1a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
d1b0: 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   n;.  int i;.  i
d1c0: 6e 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73  nt iFirst = pLis
d1d0: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
d1e0: 20 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75   : 0;.  /* pColu
d1f0: 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  mns can only be 
d200: 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f  NULL due to an O
d210: 4f 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69  OM but an OOM wi
d220: 6c 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a  ll cause an.  **
d230: 20 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74   exit prior to t
d240: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e  his routine bein
d250: 67 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69  g invoked */.  i
d260: 66 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e  f( NEVER(pColumn
d270: 73 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63  s==0) ) goto vec
d280: 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72  tor_append_error
d290: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
d2a0: 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61   ) goto vector_a
d2b0: 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20  ppend_error;..  
d2c0: 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 69 73  /* If the RHS is
d2d0: 20 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20   a vector, then 
d2e0: 77 65 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65  we can immediate
d2f0: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
d300: 74 68 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73  that .  ** the s
d310: 69 7a 65 20 6f 66 20 74 68 65 20 52 48 53 20 61  ize of the RHS a
d320: 6e 64 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42  nd LHS match.  B
d330: 75 74 20 69 66 20 74 68 65 20 52 48 53 20 69 73  ut if the RHS is
d340: 20 61 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a   a SELECT, .  **
d350: 20 77 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29   wildcards ("*")
d360: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
d370: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
d380: 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
d390: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65  d before.  ** we
d3a0: 20 63 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65   can do the size
d3b0: 20 63 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72   check, so defer
d3c0: 20 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20   the size check 
d3d0: 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72  until code gener
d3e0: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ation..  */.  if
d3f0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
d400: 53 45 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d  SELECT && pColum
d410: 6e 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69  ns->nId!=(n=sqli
d420: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
d430: 65 28 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20  e(pExpr)) ){.   
d440: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d450: 28 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c  (pParse, "%d col
d460: 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64  umns assigned %d
d470: 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20   values",.      
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
d490: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b  olumns->nId, n);
d4a0: 0a 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72  .    goto vector
d4b0: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
d4c0: 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   }..  for(i=0; i
d4d0: 3c 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20  <pColumns->nId; 
d4e0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
d4f0: 70 53 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74  pSubExpr = sqlit
d500: 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46  e3ExprForVectorF
d510: 69 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78  ield(pParse, pEx
d520: 70 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73  pr, i);.    pLis
d530: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
d540: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
d550: 2c 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70  , pList, pSubExp
d560: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  r);.    if( pLis
d570: 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
d580: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
d590: 3d 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20  =iFirst+i+1 );. 
d5a0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c       pList->a[pL
d5b0: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  ist->nExpr-1].zN
d5c0: 61 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e  ame = pColumns->
d5d0: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
d5e0: 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d    pColumns->a[i]
d5f0: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
d600: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62  }.  }..  if( !db
d610: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
d620: 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
d630: 53 45 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53  SELECT && ALWAYS
d640: 28 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  (pList!=0) ){.  
d650: 20 20 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d    Expr *pFirst =
d660: 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74   pList->a[iFirst
d670: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
d680: 65 72 74 28 20 70 46 69 72 73 74 21 3d 30 20 29  ert( pFirst!=0 )
d690: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
d6a0: 69 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  irst->op==TK_SEL
d6b0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  ECT_COLUMN );.  
d6c0: 20 20 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65     .    /* Store
d6d0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
d6e0: 65 6d 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20  ement in pRight 
d6f0: 73 6f 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65  so it will be de
d700: 6c 65 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a  leted when.    *
d710: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  * sqlite3ExprLis
d720: 74 44 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c  tDelete() is cal
d730: 6c 65 64 20 2a 2f 0a 20 20 20 20 70 46 69 72 73  led */.    pFirs
d740: 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70  t->pRight = pExp
d750: 72 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30  r;.    pExpr = 0
d760: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62  ;..    /* Rememb
d770: 65 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  er the size of t
d780: 68 65 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65  he LHS in iTable
d790: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
d7a0: 63 68 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a  check that.    *
d7b0: 2a 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48  * the RHS and LH
d7c0: 53 20 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75  S sizes match du
d7d0: 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61  ring code genera
d7e0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69  tion. */.    pFi
d7f0: 72 73 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43  rst->iTable = pC
d800: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d  olumns->nId;.  }
d810: 0a 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f  ..vector_append_
d820: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33  error:.  sqlite3
d830: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
d840: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
d850: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
d860: 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65   pColumns);.  re
d870: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
d880: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72  *.** Set the sor
d890: 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  t order for the 
d8a0: 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20  last element on 
d8b0: 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69  the given ExprLi
d8c0: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
d8d0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
d8e0: 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74  rtOrder(ExprList
d8f0: 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72   *p, int iSortOr
d900: 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  der){.  if( p==0
d910: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
d920: 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55  ert( SQLITE_SO_U
d930: 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51  NDEFINED<0 && SQ
d940: 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26  LITE_SO_ASC>=0 &
d950: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  & SQLITE_SO_DESC
d960: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
d970: 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  p->nExpr>0 );.  
d980: 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30  if( iSortOrder<0
d990: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d9a0: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
d9b0: 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  .sortOrder==SQLI
d9c0: 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20  TE_SO_ASC );.   
d9d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
d9e0: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
d9f0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29  sortOrder = (u8)
da00: 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f  iSortOrder;.}../
da10: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
da20: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  rList.a[].zName 
da30: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
da40: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
da50: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
da60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
da70: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
da80: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
da90: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
daa0: 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20  ror.  But pName 
dab0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
dac0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
dad0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
dae0: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
daf0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
db00: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
db10: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
db20: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
db30: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
db40: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
db50: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
db60: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
db70: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
db80: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
db90: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
dba0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
dbb0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
dbc0: 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65   Name to be adde
dbd0: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  d */.  int dequo
dbe0: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
dbf0: 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20  * True to cause 
dc00: 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64  the name to be d
dc10: 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  equoted */.){.  
dc20: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
dc30: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
dc40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
dc50: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
dc60: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
dc70: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
dc80: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
dc90: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
dca0: 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c  .    pItem = &pL
dcb0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
dcc0: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
dcd0: 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  rt( pItem->zName
dce0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
dcf0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
dd00: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
dd10: 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  e->db, pName->z,
dd20: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
dd30: 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71  if( dequote ) sq
dd40: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74  lite3Dequote(pIt
dd50: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
dd60: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
dd70: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53   ExprList.a[].zS
dd80: 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  pan element of t
dd90: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
dda0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
ddb0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
ddc0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
ddd0: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
dde0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
ddf0: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53  M error.  But pS
de00: 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  pan should never
de10: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
de20: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
de30: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
de40: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
de50: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
de60: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
de70: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
de80: 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65  SetSpan(.  Parse
de90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
dea0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
deb0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
dec0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
ded0: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
dee0: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
def0: 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  pan. */.  const 
df00: 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20  char *zStart,   
df10: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68    /* Start of th
df20: 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73  e span */.  cons
df30: 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20  t char *zEnd    
df40: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
df50: 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73  e span */.){.  s
df60: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
df70: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
df80: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64  t( pList!=0 || d
df90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
dfa0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
dfb0: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
dfc0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
dfd0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
dfe0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
dff0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
e000: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
e010: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e020: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
e030: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
e040: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
e050: 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74  bSpanDup(db, zSt
e060: 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a  art, zEnd);.  }.
e070: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
e080: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e090: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
e0a0: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
e0b0: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
e0c0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
e0d0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
e0e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
e0f0: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
e100: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
e110: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
e120: 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  *pEList,.  const
e130: 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29   char *zObject.)
e140: 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61  {.  int mx = pPa
e150: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
e160: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
e170: 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  UMN];.  testcase
e180: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
e190: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b  st->nExpr==mx );
e1a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
e1b0: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
e1c0: 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20  Expr==mx+1 );.  
e1d0: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
e1e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29  List->nExpr>mx )
e1f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e200: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
e210: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
e220: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
e230: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
e240: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
e250: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
e260: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
e270: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
e280: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
e290: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
e2a0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
e2b0: 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
e2c0: 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74  >nExpr;.  struct
e2d0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
e2e0: 70 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e  pItem =  pList->
e2f0: 61 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  a;.  assert( pLi
e300: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
e310: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
e320: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
e330: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
e340: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e350: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
e360: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e370: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
e380: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
e390: 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d  m++;.  }while( -
e3a0: 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  -i>0 );.  sqlite
e3b0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c  3DbFreeNN(db, pL
e3c0: 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ist);.}.void sql
e3d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
e3e0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
e3f0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e400: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20  {.  if( pList ) 
e410: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
e420: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
e430: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
e440: 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61   bitwise-OR of a
e450: 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69  ll Expr.flags fi
e460: 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65  elds in the give
e470: 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a  n.** ExprList..*
e480: 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70  /.u32 sqlite3Exp
e490: 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74  rListFlags(const
e4a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e4b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33  ){.  int i;.  u3
e4c0: 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  2 m = 0;.  asser
e4d0: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
e4e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
e4f0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
e500: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
e510: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
e520: 45 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72  Expr;.     asser
e530: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
e540: 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e      m |= pExpr->
e550: 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74  flags;.  }.  ret
e560: 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn m;.}../*.** 
e570: 54 68 69 73 20 69 73 20 61 20 53 45 4c 45 43 54  This is a SELECT
e580: 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66  -node callback f
e590: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
e5a0: 6e 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a  n walker that.**
e5b0: 20 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e   always "fails".
e5c0: 20 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74    By "fail" in t
e5d0: 68 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61  his case, we mea
e5e0: 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72  n set.** pWalker
e5f0: 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20  ->eCode to zero 
e600: 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a  and abort..**.**
e610: 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69   This callback i
e620: 73 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70  s used by multip
e630: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61  le expression wa
e640: 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lkers..*/.int sq
e650: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
e660: 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ail(Walker *pWal
e670: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
e680: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
e690: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
e6a0: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65  d);.  pWalker->e
e6b0: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Code = 0;.  retu
e6c0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a  rn WRC_Abort;.}.
e6d0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
e6e0: 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  put expression i
e6f0: 73 20 61 6e 20 49 44 20 77 69 74 68 20 74 68 65  s an ID with the
e700: 20 6e 61 6d 65 20 22 74 72 75 65 22 20 6f 72 20   name "true" or 
e710: 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20  "false".** then 
e720: 63 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20  convert it into 
e730: 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20  an TK_TRUEFALSE 
e740: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 6e 6f  term.  Return no
e750: 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74 68 65  n-zero if.** the
e760: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61 70 70   conversion happ
e770: 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f 20 69  ened, and zero i
e780: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e790: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 0a 2a   is unaltered..*
e7a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e7b0: 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 45  rIdToTrueFalse(E
e7c0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61  xpr *pExpr){.  a
e7d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e7e0: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78 70 72  ==TK_ID || pExpr
e7f0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
e800: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
e810: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
e820: 2e 7a 54 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29  .zToken, "true")
e830: 3d 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65  ==0.   || sqlite
e840: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
e850: 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65  u.zToken, "false
e860: 22 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  ")==0.  ){.    p
e870: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52  Expr->op = TK_TR
e880: 55 45 46 41 4c 53 45 3b 0a 20 20 20 20 72 65 74  UEFALSE;.    ret
e890: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
e8a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
e8b0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  The argument mus
e8c0: 74 20 62 65 20 61 20 54 4b 5f 54 52 55 45 46 41  t be a TK_TRUEFA
e8d0: 4c 53 45 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  LSE Expr node.  
e8e0: 52 65 74 75 72 6e 20 31 20 69 66 20 69 74 20 69  Return 1 if it i
e8f0: 73 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20  s TRUE.** and 0 
e900: 69 66 20 69 74 20 69 73 20 46 41 4c 53 45 2e 0a  if it is FALSE..
e910: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
e920: 70 72 54 72 75 74 68 56 61 6c 75 65 28 63 6f 6e  prTruthValue(con
e930: 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  st Expr *pExpr){
e940: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e950: 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c  ->op==TK_TRUEFAL
e960: 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SE );.  assert( 
e970: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
e980: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
e990: 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 20  true")==0.      
e9a0: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
e9b0: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
e9c0: 65 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30 20 29  en,"false")==0 )
e9d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  ;.  return pExpr
e9e0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30  ->u.zToken[4]==0
e9f0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  ;.}.../*.** Thes
ea00: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
ea10: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  alker callbacks 
ea20: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78  used to check ex
ea30: 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20  pressions to.** 
ea40: 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20  see if they are 
ea50: 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73  "constant" for s
ea60: 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ome definition o
ea70: 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65  f constant.  The
ea80: 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  .** Walker.eCode
ea90: 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65   value determine
eaa0: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63  s the type of "c
eab0: 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20  onstant" we are 
eac0: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a  looking.** for..
ead0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
eae0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
eaf0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
eb00: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
eb10: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
eb20: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
eb30: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
eb40: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
eb50: 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73  Code==1.**     s
eb60: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
eb70: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20  tantNotJoin()   
eb80: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
eb90: 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20  >eCode==2.**    
eba0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
ebb0: 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  bleConstant()   
ebc0: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
ebd0: 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20  r->eCode==3.**  
ebe0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
ebf0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
ec00: 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c  on()        pWal
ec10: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
ec20: 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20   5.**.** In all 
ec30: 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62  cases, the callb
ec40: 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e  acks set Walker.
ec50: 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72  eCode=0 and abor
ec60: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
ec70: 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20  ion.** is found 
ec80: 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73  to not be a cons
ec90: 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tant..**.** The 
eca0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
ecb0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
ecc0: 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76  ) is used for ev
ecd0: 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73  aluating express
ece0: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45  ions.** in a CRE
ecf0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
ed00: 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72  ent.  The Walker
ed10: 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20  .eCode value is 
ed20: 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a  5 when parsing.*
ed30: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63  * an existing sc
ed40: 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20  hema and 4 when 
ed50: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77  processing a new
ed60: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62   statement.  A b
ed70: 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
ed80: 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f  r raises an erro
ed90: 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d  r for new statem
eda0: 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c  ents, but is sil
edb0: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a  ently converted.
edc0: 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65  ** to NULL for e
edd0: 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e  xisting schemas.
ede0: 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71    This allows sq
edf0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
ee00: 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74  es that .** cont
ee10: 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61  ain a bound para
ee20: 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68  meter because th
ee30: 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65  ey were generate
ee40: 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
ee50: 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
ee60: 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79   to be parsed by
ee70: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
ee80: 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75  of SQLite withou
ee90: 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d  t raising a.** m
eea0: 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20  alformed schema 
eeb0: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
eec0: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
eed0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
eee0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
eef0: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
ef00: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69  pWalker->eCode i
ef10: 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 2 then any ter
ef20: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
ef30: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
ef40: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
ef50: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
ef60: 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
ef70: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
ef80: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
ef90: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
efa0: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
efb0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65   */.  if( pWalke
efc0: 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45  r->eCode==2 && E
efd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
efe0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
eff0: 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  n) ){.    pWalke
f000: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
f010: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
f020: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
f030: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
f040: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
f050: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
f060: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
f070: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
f080: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
f090: 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70   ** and either p
f0a0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
f0b0: 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e   or 5 or the fun
f0c0: 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20  ction has the.  
f0d0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43    ** SQLITE_FUNC
f0e0: 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a  _CONST flag. */.
f0f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
f100: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
f110: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d  pWalker->eCode>=
f120: 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  4 || ExprHasProp
f130: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f  erty(pExpr,EP_Co
f140: 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  nstFunc) ){.    
f150: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
f160: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
f170: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
f180: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
f190: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
f1a0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
f1b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f1c0: 49 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ID:.      /* Con
f1d0: 76 65 72 74 20 22 74 72 75 65 22 20 6f 72 20 22  vert "true" or "
f1e0: 66 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46 41  false" in a DEFA
f1f0: 55 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  ULT clause into 
f200: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70 70  the.      ** app
f210: 72 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55 45  ropriate TK_TRUE
f220: 46 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20 2a  FALSE operator *
f230: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
f240: 74 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46  te3ExprIdToTrueF
f250: 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
f260: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
f270: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
f280: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
f290: 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  hru */.    case 
f2a0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
f2b0: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
f2c0: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
f2d0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
f2e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
f2f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
f300: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f310: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
f320: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
f330: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
f340: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
f350: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
f360: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
f370: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
f380: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
f390: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
f3a0: 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  pr, EP_FixedCol)
f3b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
f3c0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
f3d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f3e0: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
f3f0: 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69  e==3 && pExpr->i
f400: 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
f410: 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  u.iCur ){.      
f420: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
f430: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
f440: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
f450: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
f460: 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a   TK_IF_NULL_ROW:
f470: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
f480: 49 53 54 45 52 3a 0a 20 20 20 20 20 20 74 65 73  ISTER:.      tes
f490: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
f4a0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
f4b0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f4c0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
f4d0: 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20  F_NULL_ROW );.  
f4e0: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
f4f0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  de = 0;.      re
f500: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
f510: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
f520: 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  ABLE:.      if( 
f530: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
f540: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 ){.        /* 
f550: 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  Silently convert
f560: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
f570: 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
f580: 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20  side of CREATE. 
f590: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
f5a0: 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c  ents into a NULL
f5b0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
f5c0: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
f5d0: 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20  nt text out.    
f5e0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
f5f0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
f600: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78  e */.        pEx
f610: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
f620: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f630: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
f640: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
f650: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
f660: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
f670: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
f680: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
f690: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
f6a0: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
f6b0: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
f6c0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f6d0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
f6e0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
f6f0: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
f700: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
f710: 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c  gh */.    defaul
f720: 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
f730: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f740: 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71  _SELECT ); /* sq
f750: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
f760: 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20  ail() disallows 
f770: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
f780: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f790: 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 71  _EXISTS ); /* sq
f7a0: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
f7b0: 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20  ail() disallows 
f7c0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
f7d0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
f7e0: 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  }.}.static int e
f7f0: 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20  xprIsConst(Expr 
f800: 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67  *p, int initFlag
f810: 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57  , int iCur){.  W
f820: 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
f830: 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20  de = initFlag;. 
f840: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
f850: 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e   = exprNodeIsCon
f860: 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65  stant;.  w.xSele
f870: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ctCallback = sql
f880: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
f890: 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  il;.#ifdef SQLIT
f8a0: 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c  E_DEBUG.  w.xSel
f8b0: 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
f8c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
f8d0: 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a  Assert2;.#endif.
f8e0: 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75    w.u.iCur = iCu
f8f0: 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  r;.  sqlite3Walk
f900: 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
f910: 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
f920: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
f930: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
f940: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
f950: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
f960: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
f970: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
f980: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
f990: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
f9a0: 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  lls..**.** For t
f9b0: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
f9c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
f9d0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
f9e0: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
f9f0: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
fa00: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
fa10: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
fa20: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
fa30: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
fa40: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
fa50: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
fa60: 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  nt(Expr *p){.  r
fa70: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
fa80: 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f  t(p, 1, 0);.}../
fa90: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
faa0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
fab0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
fac0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
fad0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
fae0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69  that does no ori
faf0: 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20  ginate from the 
fb00: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
fb10: 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a  ses of a join..*
fb20: 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74  * Return 0 if it
fb30: 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62   involves variab
fb40: 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20  les or function 
fb50: 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66  calls or terms f
fb60: 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20  rom.** an ON or 
fb70: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f  USING clause..*/
fb80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
fb90: 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
fba0: 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  n(Expr *p){.  re
fbb0: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
fbc0: 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  (p, 2, 0);.}../*
fbd0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
fbe0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
fbf0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
fc00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
fc10: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66  is constant.** f
fc20: 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f  or any single ro
fc30: 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  w of the table w
fc40: 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72 2e  ith cursor iCur.
fc50: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
fc60: 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  , the.** express
fc70: 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65 66  ion must not ref
fc80: 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65  er to any non-de
fc90: 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63  terministic func
fca0: 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20  tion nor any.** 
fcb0: 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e  table other than
fcc0: 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71   iCur..*/.int sq
fcd0: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
fce0: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
fcf0: 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 72  , int iCur){.  r
fd00: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
fd10: 74 28 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d  t(p, 3, iCur);.}
fd20: 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  .../*.** sqlite3
fd30: 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62  WalkExpr() callb
fd40: 61 63 6b 20 75 73 65 64 20 62 79 20 73 71 6c 69  ack used by sqli
fd50: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
fd60: 74 4f 72 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f  tOrGroupBy()..*/
fd70: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
fd80: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72  NodeIsConstantOr
fd90: 47 72 6f 75 70 42 79 28 57 61 6c 6b 65 72 20 2a  GroupBy(Walker *
fda0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
fdb0: 45 78 70 72 29 7b 0a 20 20 45 78 70 72 4c 69 73  Expr){.  ExprLis
fdc0: 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 57  t *pGroupBy = pW
fdd0: 61 6c 6b 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42  alker->u.pGroupB
fde0: 79 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  y;.  int i;..  /
fdf0: 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78 70 72  * Check if pExpr
fe00: 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f   is identical to
fe10: 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65   any GROUP BY te
fe20: 72 6d 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69  rm. If so, consi
fe30: 64 65 72 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73  der.  ** it cons
fe40: 74 61 6e 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  tant.  */.  for(
fe50: 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  i=0; i<pGroupBy-
fe60: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
fe70: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 47 72 6f    Expr *p = pGro
fe80: 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
fe90: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
fea0: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
feb0: 70 45 78 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20  pExpr, p, -1)<2 
fec0: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
fed0: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
fee0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70  3ExprNNCollSeq(p
fef0: 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20  Walker->pParse, 
ff00: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  p);.      if( sq
ff10: 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28 70 43  lite3IsBinary(pC
ff20: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
ff30: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
ff40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ff50: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
ff60: 69 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75  if pExpr is a su
ff70: 62 2d 73 65 6c 65 63 74 2e 20 49 66 20 73 6f 2c  b-select. If so,
ff80: 20 63 6f 6e 73 69 64 65 72 20 69 74 20 76 61 72   consider it var
ff90: 69 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20  iable. */.  if( 
ffa0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
ffb0: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
ffc0: 65 63 74 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  ect) ){.    pWal
ffd0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
ffe0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
fff0: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  bort;.  }..  ret
10000 75 72 6e 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  urn exprNodeIsCo
10010 6e 73 74 61 6e 74 28 70 57 61 6c 6b 65 72 2c 20  nstant(pWalker, 
10020 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
10030 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72 65 73   Walk the expres
10040 73 69 6f 6e 20 74 72 65 65 20 70 61 73 73 65 64  sion tree passed
10050 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
10060 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 6e  gument. Return n
10070 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66 20 74 68  on-zero.** if th
10080 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  e expression con
10090 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
100a0 66 20 63 6f 6e 73 74 61 6e 74 73 20 6f 72 20 63  f constants or c
100b0 6f 70 69 65 73 20 6f 66 20 74 65 72 6d 73 20 0a  opies of terms .
100c0 2a 2a 20 69 6e 20 70 47 72 6f 75 70 42 79 20 74  ** in pGroupBy t
100d0 68 61 74 20 73 6f 72 74 20 77 69 74 68 20 74 68  hat sort with th
100e0 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69  e BINARY collati
100f0 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  on sequence..**.
10100 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10110 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
10120 6d 69 6e 65 20 69 66 20 61 20 74 65 72 6d 20 6f  mine if a term o
10130 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  f the HAVING cla
10140 75 73 65 20 63 61 6e 0a 2a 2a 20 62 65 20 70 72  use can.** be pr
10150 6f 6d 6f 74 65 64 20 69 6e 74 6f 20 74 68 65 20  omoted into the 
10160 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 49  WHERE clause.  I
10170 6e 20 6f 72 64 65 72 20 66 6f 72 20 73 75 63 68  n order for such
10180 20 61 20 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20   a promotion to 
10190 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  work,.** the val
101a0 75 65 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47  ue of the HAVING
101b0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6d 75 73   clause term mus
101c0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 66 6f  t be the same fo
101d0 72 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  r all members of
101e0 0a 2a 2a 20 61 20 22 67 72 6f 75 70 22 2e 20 20  .** a "group".  
101f0 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  The requirement 
10200 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42  that the GROUP B
10210 59 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 42  Y term must be B
10220 49 4e 41 52 59 0a 2a 2a 20 61 73 73 75 6d 65 73  INARY.** assumes
10230 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
10240 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10250 65 20 77 69 6c 6c 20 68 61 76 65 20 61 20 66 69  e will have a fi
10260 6e 65 72 2d 67 72 61 69 6e 65 64 0a 2a 2a 20 67  ner-grained.** g
10270 72 6f 75 70 69 6e 67 20 74 68 61 6e 20 62 69 6e  rouping than bin
10280 61 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ary.  In other w
10290 6f 72 64 73 20 28 41 3d 42 20 43 4f 4c 4c 41 54  ords (A=B COLLAT
102a0 45 20 62 69 6e 61 72 79 29 20 69 6d 70 6c 69 65  E binary) implie
102b0 73 0a 2a 2a 20 41 3d 42 20 69 6e 20 65 76 65 72  s.** A=B in ever
102c0 79 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e  y other collatin
102d0 67 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 65  g sequence.  The
102e0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61   requirement tha
102f0 74 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42  t the.** GROUP B
10300 59 20 62 65 20 42 49 4e 41 52 59 20 69 73 20 73  Y be BINARY is s
10310 74 72 69 63 74 65 72 20 74 68 61 6e 20 6e 65 63  tricter than nec
10320 65 73 73 61 72 79 2e 20 20 49 74 20 77 6f 75 6c  essary.  It woul
10330 64 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74  d also work.** t
10340 6f 20 70 72 6f 6d 6f 74 65 20 48 41 56 49 4e 47  o promote HAVING
10350 20 63 6c 61 75 73 65 73 20 74 68 61 74 20 75 73   clauses that us
10360 65 20 74 68 65 20 73 61 6d 65 20 61 6c 74 65 72  e the same alter
10370 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67  native collating
10380 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61 73 20  .** sequence as 
10390 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
103a0 6d 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6d  m, but that is m
103b0 75 63 68 20 68 61 72 64 65 72 20 74 6f 20 63 68  uch harder to ch
103c0 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61 74  eck,.** alternat
103d0 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ive collating se
103e0 71 75 65 6e 63 65 73 20 61 72 65 20 75 6e 63 6f  quences are unco
103f0 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73 20 69  mmon, and this i
10400 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74  s only an.** opt
10410 69 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f 20 77 65  imization, so we
10420 20 74 61 6b 65 20 74 68 65 20 65 61 73 79 20 77   take the easy w
10430 61 79 20 6f 75 74 20 61 6e 64 20 73 69 6d 70 6c  ay out and simpl
10440 79 20 72 65 71 75 69 72 65 20 74 68 65 0a 2a 2a  y require the.**
10450 20 47 52 4f 55 50 20 42 59 20 74 6f 20 75 73 65   GROUP BY to use
10460 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c   the BINARY coll
10470 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
10480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
10490 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  prIsConstantOrGr
104a0 6f 75 70 42 79 28 50 61 72 73 65 20 2a 70 50 61  oupBy(Parse *pPa
104b0 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 45 78  rse, Expr *p, Ex
104c0 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
104d0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
104e0 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20   w.eCode = 1;.  
104f0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
10500 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  = exprNodeIsCons
10510 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 3b 0a 20  tantOrGroupBy;. 
10520 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
10530 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 47  ck = 0;.  w.u.pG
10540 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
10550 79 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  y;.  w.pParse = 
10560 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
10570 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
10580 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
10590 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  de;.}../*.** Wal
105a0 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
105b0 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
105c0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
105d0 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
105e0 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
105f0 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
10600 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
10610 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
10620 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
10630 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
10640 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
10650 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
10660 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
10670 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
10680 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
10690 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
106a0 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
106b0 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
106c0 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
106d0 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
106e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
106f0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
10700 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
10710 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20  , u8 isInit){.  
10720 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d  assert( isInit==
10730 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29  0 || isInit==1 )
10740 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  ;.  return exprI
10750 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e  sConst(p, 4+isIn
10760 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65  it, 0);.}..#ifde
10770 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10780 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a  CURSOR_HINTS./*.
10790 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
107a0 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
107b0 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
107c0 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ression contains
107d0 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f   a.** subquery o
107e0 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65  f some kind.  Re
107f0 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20  turn 0 if there 
10800 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65  are no subquerie
10810 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
10820 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62  3ExprContainsSub
10830 71 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a  query(Expr *p){.
10840 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
10850 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
10860 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
10870 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
10880 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  op;.  w.xSelectC
10890 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
108a0 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b  3SelectWalkFail;
108b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
108c0 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74  EBUG.  w.xSelect
108d0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69  Callback2 = sqli
108e0 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73  te3SelectWalkAss
108f0 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ert2;.#endif.  s
10900 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
10910 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
10920 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65  w.eCode==0;.}.#e
10930 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
10940 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
10950 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
10960 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
10970 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
10980 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
10990 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
109a0 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
109b0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
109c0 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
109d0 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
109e0 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
109f0 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
10a00 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
10a10 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
10a20 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
10a30 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
10a40 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
10a50 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
10a60 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
10a70 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
10a80 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
10a90 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66  int rc = 0;.  if
10aa0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
10ab0 30 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20  0;  /* Can only 
10ac0 68 61 70 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  happen following
10ad0 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a   on OOM */..  /*
10ae0 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   If an expressio
10af0 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  n is an integer 
10b00 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74  literal that fit
10b10 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  s in a signed 32
10b20 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65  -bit.  ** intege
10b30 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49  r, then the EP_I
10b40 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c  ntValue flag wil
10b50 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
10b60 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73  een set */.  ass
10b70 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49  ert( p->op!=TK_I
10b80 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c  NTEGER || (p->fl
10b90 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
10ba0 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  e)!=0.          
10bb0 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e   || sqlite3GetIn
10bc0 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  t32(p->u.zToken,
10bd0 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69   &rc)==0 );..  i
10be0 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
10bf0 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
10c00 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e   *pValue = p->u.
10c10 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75  iValue;.    retu
10c20 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74  rn 1;.  }.  swit
10c30 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
10c40 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
10c50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
10c60 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
10c70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c  r(p->pLeft, pVal
10c80 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
10c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10ca0 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
10cb0 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20      int v;.     
10cc0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
10cd0 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
10ce0 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  ft, &v) ){.     
10cf0 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d     assert( v!=(-
10d00 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b  2147483647-1) );
10d10 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
10d20 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
10d30 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
10d40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10d50 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  }.    default: b
10d60 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
10d70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10d80 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
10d90 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
10da0 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ce that the expr
10db0 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55  ession can be NU
10dc0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  LL..**.** If the
10dd0 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68   expression migh
10de0 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20  t be NULL or if 
10df0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
10e00 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a  s too complex.**
10e10 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20   to tell return 
10e20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  TRUE.  .**.** Th
10e30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
10e40 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ed as an optimiz
10e50 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f  ation, to skip O
10e60 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73  P_IsNull opcodes
10e70 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77  .** when we know
10e80 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61   that a value ca
10e90 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48  nnot be NULL.  H
10ea0 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f  ence, a false po
10eb0 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72  sitive.** (retur
10ec0 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69  ning TRUE when i
10ed0 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65  n fact the expre
10ee0 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20  ssion can never 
10ef0 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a  be NULL) might.*
10f00 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72  * be a small per
10f10 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74  formance hit but
10f20 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61   is otherwise ha
10f30 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20  rmless.  On the 
10f40 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61  other.** hand, a
10f50 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20   false negative 
10f60 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45  (returning FALSE
10f70 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
10f80 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a   could be NULL).
10f90 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  ** will likely r
10fa0 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
10fb0 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53  rrect answer.  S
10fc0 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  o when in doubt,
10fd0 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e   return.** TRUE.
10fe0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
10ff0 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e  xprCanBeNull(con
11000 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75  st Expr *p){.  u
11010 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70  8 op;.  while( p
11020 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
11030 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
11040 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65  US ){ p = p->pLe
11050 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ft; }.  op = p->
11060 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
11070 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
11080 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
11090 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
110a0 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
110b0 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
110c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
110d0 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
110e0 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74  _BLOB:.      ret
110f0 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20  urn 0;.    case 
11100 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20  TK_COLUMN:.     
11110 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50   return ExprHasP
11120 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61  roperty(p, EP_Ca
11130 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20  nBeNull) ||.    
11140 20 20 20 20 20 20 20 20 20 70 2d 3e 70 54 61 62           p->pTab
11150 3d 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66 65 72  ==0 ||  /* Refer
11160 65 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f  ence to column o
11170 66 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72 65  f index on expre
11180 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ssion */.       
11190 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d        (p->iColum
111a0 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d  n>=0 && p->pTab-
111b0 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e  >aCol[p->iColumn
111c0 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20  ].notNull==0);. 
111d0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
111e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
111f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11200 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
11210 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
11220 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68  a constant which
11230 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63   would be.** unc
11240 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66  hanged by OP_Aff
11250 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61  inity with the a
11260 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e  ffinity given in
11270 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
11280 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
11290 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
112a0 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
112b0 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e   if the OP_Affin
112c0 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  ity operation.**
112d0 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e   can be omitted.
112e0 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20    When in doubt 
112f0 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41  return FALSE.  A
11300 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a   false negative.
11310 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20  ** is harmless. 
11320 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   A false positiv
11330 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20  e, however, can 
11340 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72  result in the wr
11350 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a  ong.** answer..*
11360 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
11370 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
11380 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70  Change(const Exp
11390 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b  r *p, char aff){
113a0 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20  .  u8 op;.  if( 
113b0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
113c0 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b  BLOB ) return 1;
113d0 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
113e0 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
113f0 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
11400 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
11410 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
11420 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
11430 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
11440 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
11450 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
11460 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
11470 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
11480 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
11490 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
114a0 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
114b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
114c0 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  OAT: {.      ret
114d0 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
114e0 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d  AFF_REAL || aff=
114f0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
11500 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
11510 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
11520 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
11530 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f==SQLITE_AFF_TE
11540 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  XT;.    }.    ca
11550 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
11560 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
11570 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11580 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
11590 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c  assert( p->iTabl
115a0 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61  e>=0 );  /* p ca
115b0 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20  nnot be part of 
115c0 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  a CHECK constrai
115d0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  nt */.      retu
115e0 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a  rn p->iColumn<0.
115f0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66            && (af
11600 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
11610 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
11620 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
11630 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  );.    }.    def
11640 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65  ault: {.      re
11650 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
11660 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
11670 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
11680 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20  ven string is a 
11690 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61  row-id column na
116a0 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  me..*/.int sqlit
116b0 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20  e3IsRowid(const 
116c0 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20  char *z){.  if( 
116d0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
116e0 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20  , "_ROWID_")==0 
116f0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
11700 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
11710 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20  (z, "ROWID")==0 
11720 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
11730 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
11740 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20  (z, "OID")==0 ) 
11750 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
11760 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn 0;.}../*.** p
11770 58 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20  X is the RHS of 
11780 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  an IN operator. 
11790 20 49 66 20 70 58 20 69 73 20 61 20 53 45 4c 45   If pX is a SELE
117a0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  CT statement .**
117b0 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d   that can be sim
117c0 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69 72  plified to a dir
117d0 65 63 74 20 74 61 62 6c 65 20 61 63 63 65 73 73  ect table access
117e0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a  , then return.**
117f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
11800 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
11810 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f  nt.  If pX is no
11820 74 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  t a SELECT state
11830 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  ment,.** or if t
11840 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
11850 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ent needs to be 
11860 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20  manifested into 
11870 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74  a transient.** t
11880 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72  able, then retur
11890 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64  n NULL..*/.#ifnd
118a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
118b0 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 53  UBQUERY.static S
118c0 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61  elect *isCandida
118d0 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20  teForInOpt(Expr 
118e0 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  *pX){.  Select *
118f0 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  p;.  SrcList *pS
11900 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc;.  ExprList *
11910 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
11920 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pTab;.  int i;.
11930 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
11940 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
11950 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75 72  sSelect) ) retur
11960 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73  n 0;  /* Not a s
11970 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28  ubquery */.  if(
11980 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
11990 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  (pX, EP_VarSelec
119a0 74 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20  t)  ) return 0; 
119b0 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73   /* Correlated s
119c0 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d  ubq */.  p = pX-
119d0 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66  >x.pSelect;.  if
119e0 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65  ( p->pPrior ) re
119f0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
11a00 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f       /* Not a co
11a10 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
11a20 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
11a30 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
11a40 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20  t|SF_Aggregate) 
11a50 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
11a60 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
11a70 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
11a80 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
11a90 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
11aa0 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65  testcase( (p->se
11ab0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
11ac0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
11ad0 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
11ae0 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  te );.    return
11af0 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e   0; /* No DISTIN
11b00 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e  CT keyword and n
11b10 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
11b20 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61  tions */.  }.  a
11b30 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
11b40 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  By==0 );        
11b50 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
11b60 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
11b70 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  */.  if( p->pLim
11b80 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
11b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
11ba0 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75  as no LIMIT clau
11bb0 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
11bc0 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
11bd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11be0 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63  * Has no WHERE c
11bf0 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20  lause */.  pSrc 
11c00 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
11c10 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
11c20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
11c30 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
11c40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
11c50 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20  le term in FROM 
11c60 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
11c70 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
11c80 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
11c90 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f     /* FROM is no
11ca0 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20  t a subquery or 
11cb0 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d  view */.  pTab =
11cc0 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
11cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
11ce0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
11cf0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
11d00 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
11d10 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  /* FROM clause i
11d20 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a  s not a view */.
11d30 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
11d40 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
11d50 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  ;        /* FROM
11d60 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69   clause not a vi
11d70 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
11d80 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
11d90 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ist;.  assert( p
11da0 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f 2a  EList!=0 );.  /*
11db0 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73 75   All SELECT resu
11dc0 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c 75  lts must be colu
11dd0 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  mns. */.  for(i=
11de0 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
11df0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
11e00 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69 73  pr *pRes = pELis
11e10 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
11e20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70 21     if( pRes->op!
11e30 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
11e40 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65 72  urn 0;.    asser
11e50 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d  t( pRes->iTable=
11e60 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72  =pSrc->a[0].iCur
11e70 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61  sor );  /* Not a
11e80 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
11e90 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  uery */.  }.  re
11ea0 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66  turn p;.}.#endif
11eb0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11ec0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
11ed0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11ee0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
11ef0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
11f00 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65  at checks the le
11f10 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
11f20 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43  f index table iC
11f30 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20  ur to see if.** 
11f40 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  it contains any 
11f50 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43  NULL entries.  C
11f60 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65  ause the registe
11f70 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20  r at regHasNull 
11f80 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20  to be set.** to 
11f90 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
11fa0 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
11fb0 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75  s no NULLs.  Cau
11fc0 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48  se register regH
11fd0 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20  asNull.** to be 
11fe0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69  set to NULL if i
11ff0 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  Cur contains one
12000 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
12010 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
12020 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48  void sqlite3SetH
12030 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20  asNullFlag(Vdbe 
12040 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e  *v, int iCur, in
12050 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20  t regHasNull){. 
12060 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71   int addr1;.  sq
12070 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12080 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
12090 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20  , regHasNull);. 
120a0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
120b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
120c0 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20  _Rewind, iCur); 
120d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
120e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
120f0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
12100 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48  n, iCur, 0, regH
12110 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74  asNull);.  sqlit
12120 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
12130 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  , OPFLAG_TYPEOFA
12140 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  RG);.  VdbeComme
12150 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e  nt((v, "first_en
12160 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75  try_in(%d)", iCu
12170 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r));.  sqlite3Vd
12180 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
12190 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  dr1);.}.#endif..
121a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
121b0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
121c0 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
121d0 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
121e0 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28  or with a list (
121f0 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
12200 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74  on the .** right
12210 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74  -hand side.  Ret
12220 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74  urn TRUE if that
12230 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e   list is constan
12240 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
12250 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43   sqlite3InRhsIsC
12260 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49  onstant(Expr *pI
12270 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53  n){.  Expr *pLHS
12280 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61  ;.  int res;.  a
12290 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
122a0 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f  roperty(pIn, EP_
122b0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
122c0 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66  pLHS = pIn->pLef
122d0 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20  t;.  pIn->pLeft 
122e0 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c  = 0;.  res = sql
122f0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
12300 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e  nt(pIn);.  pIn->
12310 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20  pLeft = pLHS;.  
12320 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65  return res;.}.#e
12330 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
12340 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
12350 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
12360 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
12370 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  N (...) operator
12380 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61  ..** The pX para
12390 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70  meter is the exp
123a0 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52  ression on the R
123b0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
123c0 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20  rator, which.** 
123d0 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
123e0 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
123f0 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75  sions or a subqu
12400 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ery..**.** The j
12410 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
12420 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ne is to find or
12430 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
12440 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e   object that can
12450 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68  .** be used eith
12460 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
12470 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65  embership in the
12480 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69   RHS set or to i
12490 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
124a0 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  * all members of
124b0 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b   the RHS set, sk
124c0 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
124d0 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  s..**.** A curso
124e0 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  r is opened on t
124f0 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
12500 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53   that is the RHS
12510 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12520 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69  tor.** and pX->i
12530 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
12540 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
12550 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t cursor..**.** 
12560 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
12570 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
12580 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68  ion indicates th
12590 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61  e b-tree type, a
125a0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
125b0 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49     IN_INDEX_ROWI
125c0 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72  D      - The cur
125d0 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
125e0 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
125f0 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
12600 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54  X_INDEX_ASC  - T
12610 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
12620 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e  ened on an ascen
12630 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
12640 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
12650 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f  DESC - The curso
12660 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
12670 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
12680 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
12690 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54  X_EPH        - T
126a0 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
126b0 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
126c0 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
126d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
126e0 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
126f0 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
12700 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
12710 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d  DEX_NOOP       -
12720 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61   No cursor was a
12730 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49  llocated.  The I
12740 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20  N operator must 
12750 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d                im
12770 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73  plemented as a s
12780 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
12790 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  risons..**.** An
127a0 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65   existing b-tree
127b0 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69   might be used i
127c0 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73  f the RHS expres
127d0 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d  sion pX is a sim
127e0 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ple.** subquery 
127f0 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  such as:.**.**  
12800 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
12810 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e  n1>, <column2>..
12820 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a  . FROM <table>.*
12830 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20  *.** If the RHS 
12840 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
12850 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20  or is a list or 
12860 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73  a more complex s
12870 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  ubquery, then.**
12880 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
12890 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ble might need t
128a0 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66  o be generated f
128b0 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20  rom the RHS and 
128c0 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62  then.** pX->iTab
128d0 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  le made to point
128e0 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61   to the ephemera
128f0 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  l table instead 
12900 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  of an.** existin
12910 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  g table..**.** T
12920 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d  he inFlags param
12930 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69  eter must contai
12940 6e 2c 20 61 74 20 61 20 6d 69 6e 69 6d 75 6d 2c  n, at a minimum,
12950 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74 73   one of the bits
12960 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
12970 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e  BERSHIP or IN_IN
12980 44 45 58 5f 4c 4f 4f 50 20 62 75 74 20 6e 6f 74  DEX_LOOP but not
12990 20 62 6f 74 68 2e 20 20 49 66 20 69 6e 46 6c 61   both.  If inFla
129a0 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49  gs contains.** I
129b0 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
129c0 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e  IP, then the gen
129d0 65 72 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c  erated table wil
129e0 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20  l be used for a 
129f0 66 61 73 74 0a 2a 2a 20 6d 65 6d 62 65 72 73 68  fast.** membersh
12a00 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74  ip test.  When t
12a10 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  he IN_INDEX_LOOP
12a20 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65   bit is set, the
12a30 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 0a 2a   IN index will.*
12a40 2a 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f  * be used to loo
12a50 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65  p over all value
12a60 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20  s of the RHS of 
12a70 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
12a80 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
12a90 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65  NDEX_LOOP is use
12aa0 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65  d (and the b-tre
12ab0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
12ac0 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
12ad0 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
12ae0 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62  bers) then the b
12af0 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63  -tree must not c
12b00 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65  ontain duplicate
12b10 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d  s..** An epherem
12b20 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
12b30 20 63 72 65 61 74 65 64 20 75 6e 6c 65 73 73 20   created unless 
12b40 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c  the selected col
12b50 75 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e 74  umns are guarant
12b60 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69  eed.** to be uni
12b70 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63  que - either bec
12b80 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e  ause it is an IN
12b90 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
12ba0 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61  Y or due to.** a
12bb0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
12bc0 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  nt or index..**.
12bd0 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58  ** When IN_INDEX
12be0 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20 75  _MEMBERSHIP is u
12bf0 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74  sed (and the b-t
12c00 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
12c10 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65   .** for fast se
12c20 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
12c30 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65  ts) then an ephe
12c40 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74  remal table must
12c50 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c   .** be used unl
12c60 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73  ess <columns> is
12c70 20 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47 45   a single INTEGE
12c80 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
12c90 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69  lumn or an .** i
12ca0 6e 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75 6e  ndex can be foun
12cb0 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
12cc0 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61  fied <columns> a
12cd0 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e  s its left-most.
12ce0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e  .**.** If the IN
12cf0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61  _INDEX_NOOP_OK a
12d00 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  nd IN_INDEX_MEMB
12d10 45 52 53 48 49 50 20 61 72 65 20 62 6f 74 68 20  ERSHIP are both 
12d20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68  set and.** if th
12d30 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
12d40 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
12d50 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65  st (not a subque
12d60 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ry) then this.**
12d70 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64   routine might d
12d80 65 63 69 64 65 20 74 68 61 74 20 63 72 65 61 74  ecide that creat
12d90 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
12da0 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62   b-tree for memb
12db0 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e  ership.** testin
12dc0 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69  g is too expensi
12dd0 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e  ve and return IN
12de0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e  _INDEX_NOOP.  In
12df0 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a   that case, the.
12e00 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
12e10 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d  ne should implem
12e20 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61  ent the IN opera
12e30 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71 75  tor using a sequ
12e40 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72  ence.** of Eq or
12e50 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   Ne comparison o
12e60 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
12e70 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   When the b-tree
12e80 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66   is being used f
12e90 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  or membership te
12ea0 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  sts, the calling
12eb0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67   function.** mig
12ec0 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  ht need to know 
12ed0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
12ee0 68 65 20 52 48 53 20 73 69 64 65 20 6f 66 20 74  he RHS side of t
12ef0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
12f00 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c  * contains a NUL
12f10 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61 73 4e  L.  If prRhsHasN
12f20 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c  ull is not a NUL
12f30 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a  L pointer and .*
12f40 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  * if there is an
12f50 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  y chance that th
12f60 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f  e (...) might co
12f70 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c  ntain a NULL val
12f80 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65  ue at.** runtime
12f90 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65  , then a registe
12fa0 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
12fb0 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20  nd the register 
12fc0 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a  number written.*
12fd0 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75  * to *prRhsHasNu
12fe0 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  ll. If there is 
12ff0 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
13000 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e  he (...) contain
13010 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
13020 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61  e, then *prRhsHa
13030 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e  sNull is left un
13040 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
13050 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
13060 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74  allocated and it
13070 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65  s location store
13080 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75  d in *prRhsHasNu
13090 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ll, then.** the 
130a0 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65  value in that re
130b0 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e  gister will be N
130c0 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65  ULL if the b-tre
130d0 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  e contains one o
130e0 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76  r more.** NULL v
130f0 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69  alues, and it wi
13100 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e  ll be some non-N
13110 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65  ULL value if the
13120 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73   b-tree contains
13130 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75   no.** NULL valu
13140 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
13150 20 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65 72   aiMap parameter
13160 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
13170 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
13180 6e 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 69  n array containi
13190 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e  ng.** one elemen
131a0 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  t for each colum
131b0 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  n returned by th
131c0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
131d0 6e 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a  nt on the RHS.**
131e0 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20   of the IN(...) 
131f0 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69 27  operator. The i'
13200 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
13210 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74  array is populat
13220 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f  ed with the.** o
13230 66 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e 64  ffset of the ind
13240 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d  ex column that m
13250 61 74 63 68 65 73 20 74 68 65 20 69 27 74 68 20  atches the i'th 
13260 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20  column returned 
13270 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  by the.** SELECT
13280 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
13290 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
132a0 20 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69 6e   and selected in
132b0 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  dex are:.**.**  
132c0 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c   (?,?,?) IN (SEL
132d0 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d  ECT a, b, c FROM
132e0 20 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54 45   t1).**   CREATE
132f0 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
13300 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20  b, c, a);.**.** 
13310 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20  then aiMap[] is 
13320 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 7b  populated with {
13330 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66  2, 0, 1}..*/.#if
13340 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13350 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
13360 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
13370 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13380 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
13390 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
133a0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 2c  t */.  Expr *pX,
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133c0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68    /* The right-h
133d0 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 6f  and side (RHS) o
133e0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
133f0 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c 61  r */.  u32 inFla
13400 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
13410 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f    /* IN_INDEX_LO
13420 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50 2c  OP, _MEMBERSHIP,
13430 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b   and/or _NOOP_OK
13440 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68 73   */.  int *prRhs
13450 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20  HasNull,        
13460 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
13470 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75 73  ding NULL status
13480 2e 20 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f 0a  .  See notes */.
13490 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 20 20 20    int *aiMap    
134a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
134b0 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e 64  Mapping from Ind
134c0 65 78 20 66 69 65 6c 64 73 20 74 6f 20 52 48 53  ex fields to RHS
134d0 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20   fields */.){.  
134e0 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20  Select *p;      
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
13510 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
13520 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
13530 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20   int eType = 0; 
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
13560 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f  f RHS table. IN_
13570 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74  INDEX_* */.  int
13580 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
13590 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20  nTab++;         
135a0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
135b0 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f  the RHS table */
135c0 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
135d0 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  que;            
135e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
135f0 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20   if RHS must be 
13600 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65  unique */.  Vdbe
13610 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
13620 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
13630 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
13640 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
13650 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
13660 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
13670 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d    mustBeUnique =
13680 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
13690 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a  NDEX_LOOP)!=0;..
136a0 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20    /* If the RHS 
136b0 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20  of this IN(...) 
136c0 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45  operator is a SE
136d0 4c 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20  LECT, and if it 
136e0 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68  matters .  ** wh
136f0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
13700 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63   SELECT result c
13710 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
13720 75 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68  ues, check wheth
13730 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e  er.  ** or not N
13740 55 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ULL is actually 
13750 70 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79  possible (it may
13760 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61   not be, for exa
13770 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20  mple, due .  ** 
13780 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  to NOT NULL cons
13790 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73  traints in the s
137a0 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55  chema). If no NU
137b0 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  LL values are po
137c0 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74  ssible,.  ** set
137d0 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f   prRhsHasNull to
137e0 20 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e   0 before contin
137f0 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20  uing.  */.  if( 
13800 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20  prRhsHasNull && 
13810 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pX->flags & EP_
13820 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
13830 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70    int i;.    Exp
13840 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
13850 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pX->x.pSelect->p
13860 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
13870 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
13880 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
13890 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
138a0 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74  CanBeNull(pEList
138b0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20  ->a[i].pExpr) ) 
138c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
138d0 20 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e   if( i==pEList->
138e0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  nExpr ){.      p
138f0 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
13900 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13910 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
13920 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
13930 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  le or index can 
13940 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  be used to.  ** 
13950 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72  satisfy the quer
13960 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66  y.  This is pref
13970 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61  erable to genera
13980 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a  ting a new .  **
13990 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
139a0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
139b0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28  se->nErr==0 && (
139c0 70 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46  p = isCandidateF
139d0 6f 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20  orInOpt(pX))!=0 
139e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
139f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a10 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
13a20 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c  tion */.    Tabl
13a30 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a50 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62     /* Table <tab
13a60 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20  le>. */.    i16 
13a70 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
13aa0 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  dx for pTab */. 
13ab0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
13ac0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
13ad0 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
13ae0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
13af0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
13b00 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20  pEList!=0 );    
13b10 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61           /* Beca
13b20 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
13b30 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
13b40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
13b50 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
13b60 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61  pr!=0 ); /* Beca
13b70 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
13b80 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
13b90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
13ba0 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20  pSrc!=0 );      
13bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61           /* Beca
13bc0 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
13bd0 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
13be0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70  .    pTab = p->p
13bf0 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
13c00 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
13c10 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61  OP_Transaction a
13c20 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20  nd OP_TableLock 
13c30 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  for <table>. */.
13c40 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
13c50 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
13c60 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
13c70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
13c80 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
13c90 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
13ca0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
13cb0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
13cc0 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
13cd0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
13ce0 20 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a 20   assert(v);  /* 
13cf0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29  sqlite3GetVdbe()
13d00 20 68 61 73 20 61 6c 77 61 79 73 20 62 65 65 6e   has always been
13d10 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
13d20 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45  ed */.    if( nE
13d30 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
13d40 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[0].pExpr->iC
13d50 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
13d60 20 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28 53   /* The "x IN (S
13d70 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
13d80 20 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a 2f   table)" case */
13d90 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72  .      int iAddr
13da0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13db0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
13dc0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
13dd0 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20  rage(v);..      
13de0 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
13df0 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
13e00 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
13e10 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54  nRead);.      eT
13e20 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
13e30 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c  OWID;..      sql
13e40 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
13e50 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
13e60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
13e70 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e90 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
13ea0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
13eb0 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  int affinity_ok 
13ec0 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 1;.      int i
13ed0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
13ee0 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e  k that the affin
13ef0 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ity that will be
13f00 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d   used to perform
13f10 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20   each .      ** 
13f20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68  comparison is th
13f30 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66  e same as the af
13f40 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63  finity of each c
13f50 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20  olumn in table. 
13f60 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52       ** on the R
13f70 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
13f80 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f  rator.  If it no
13f90 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  t, it is not pos
13fa0 73 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a  sible to.      *
13fb0 2a 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20  * use any index 
13fc0 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65  of the RHS table
13fd0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
13fe0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20  i=0; i<nExpr && 
13ff0 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b  affinity_ok; i++
14000 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
14010 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56  *pLhs = sqlite3V
14020 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
14030 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b  r(pX->pLeft, i);
14040 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
14050 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  l = pEList->a[i]
14060 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  .pExpr->iColumn;
14070 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64  .        char id
14080 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61  xaff = sqlite3Ta
14090 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
140a0 79 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a  y(pTab,iCol); /*
140b0 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20   RHS table */.  
140c0 20 20 20 20 20 20 63 68 61 72 20 63 6d 70 61 66        char cmpaf
140d0 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
140e0 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c  reAffinity(pLhs,
140f0 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20   idxaff);.      
14100 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70 61    testcase( cmpa
14110 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ff==SQLITE_AFF_B
14120 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74  LOB );.        t
14130 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d  estcase( cmpaff=
14140 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
14150 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74   );.        swit
14160 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20  ch( cmpaff ){.  
14170 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
14180 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20  ITE_AFF_BLOB:.  
14190 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
141a0 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
141b0 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a  SQLITE_AFF_TEXT:
141c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
141d0 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
141e0 66 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65  finity() only re
141f0 74 75 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e  turns TEXT if on
14200 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
14210 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68            ** oth
14220 65 72 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69  er has no affini
14230 74 79 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  ty and the other
14240 20 73 69 64 65 20 69 73 20 54 45 58 54 2e 20 20   side is TEXT.  
14250 48 65 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20  Hence,.         
14260 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77     ** the only w
14270 61 79 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f  ay for cmpaff to
14280 20 62 65 20 54 45 58 54 20 69 73 20 66 6f 72 20   be TEXT is for 
14290 69 64 78 61 66 66 20 74 6f 20 62 65 20 54 45 58  idxaff to be TEX
142a0 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  T.            **
142b0 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72   and for the ter
142c0 6d 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  m on the LHS of 
142d0 74 68 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e  the IN to have n
142e0 6f 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  o affinity. */. 
142f0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
14300 74 28 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54  t( idxaff==SQLIT
14310 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
14320 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14330 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75  .          defau
14340 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt:.            
14350 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71  affinity_ok = sq
14360 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
14370 66 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a  finity(idxaff);.
14380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14390 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 61 66 66  }..      if( aff
143a0 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20  inity_ok ){.    
143b0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
143c0 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e  r an existing in
143d0 64 65 78 20 74 68 61 74 20 77 69 6c 6c 20 77 6f  dex that will wo
143e0 72 6b 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f  rk for this IN o
143f0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
14400 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
14410 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26  ->pIndex; pIdx &
14420 26 20 65 54 79 70 65 3d 3d 30 3b 20 70 49 64 78  & eType==0; pIdx
14430 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
14440 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b           Bitmask
14450 20 63 6f 6c 55 73 65 64 3b 20 20 20 20 20 20 2f   colUsed;      /
14460 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * Columns of the
14470 20 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 20   index used */. 
14480 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b           Bitmask
14490 20 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f   mCol;         /
144a0 2a 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 63  * Mask for the c
144b0 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f  urrent column */
144c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
144d0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78  Idx->nColumn<nEx
144e0 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pr ) continue;. 
144f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
14500 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42  mum nColumn is B
14510 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c  MS-2, not BMS-1,
14520 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
14530 63 6f 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20  compute.        
14540 20 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78    ** BITMASK(nEx
14550 70 72 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72  pr) without over
14560 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20  flowing */.     
14570 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
14580 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d  Idx->nColumn==BM
14590 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20  S-2 );.         
145a0 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d   testcase( pIdx-
145b0 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20  >nColumn==BMS-1 
145c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
145d0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
145e0 42 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65  BMS-1 ) continue
145f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14600 6d 75 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a  mustBeUnique ){.
14610 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14620 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45  pIdx->nKeyCol>nE
14630 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  xpr.            
14640 20 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   ||(pIdx->nColum
14650 6e 3e 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e  n>nExpr && !IsUn
14660 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 29  iqueIndex(pIdx))
14670 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
14690 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73  ntinue;  /* This
146a0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e   index is not un
146b0 69 71 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e  ique over the IN
146c0 20 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a   RHS columns */.
146d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
146e0 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
146f0 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d         colUsed =
14700 20 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73   0;   /* Columns
14710 20 6f 66 20 69 6e 64 65 78 20 75 73 65 64 20 73   of index used s
14720 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
14730 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
14740 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
14750 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68         Expr *pLh
14760 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  s = sqlite3Vecto
14770 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58  rFieldSubexpr(pX
14780 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  ->pLeft, i);.   
14790 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
147a0 52 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Rhs = pEList->a[
147b0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
147c0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
147d0 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
147e0 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
147f0 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20  q(pParse, pLhs, 
14800 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20  pRhs);.         
14810 20 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20     int j;.  .   
14820 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
14830 20 70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73   pReq!=0 || pRhs
14840 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f  ->iColumn==XN_RO
14850 57 49 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  WID || pParse->n
14860 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Err );.         
14870 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45     for(j=0; j<nE
14880 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
14890 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
148a0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d  x->aiColumn[j]!=
148b0 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  pRhs->iColumn ) 
148c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
148d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
148e0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20  pIdx->azColl[j] 
148f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
14900 20 69 66 28 20 70 52 65 71 21 3d 30 20 26 26 20   if( pReq!=0 && 
14910 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
14920 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78  Req->zName, pIdx
14930 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
14940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
14950 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
14960 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
14970 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
14980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
14990 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
149a0 6a 3d 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b  j==nExpr ) break
149b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 43  ;.            mC
149c0 6f 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b  ol = MASKBIT(j);
149d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
149e0 20 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20   mCol & colUsed 
149f0 29 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68  ) break; /* Each
14a00 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c   column used onl
14a10 79 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20  y once */.      
14a20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d        colUsed |=
14a30 20 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20   mCol;.         
14a40 20 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61     if( aiMap ) a
14a50 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  iMap[i] = j;.   
14a60 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
14a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
14a80 3d 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65  =nExpr || colUse
14a90 64 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70  d!=(MASKBIT(nExp
14aa0 72 29 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  r)-1) );.       
14ab0 20 20 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d     if( colUsed==
14ac0 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d  (MASKBIT(nExpr)-
14ad0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
14ae0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
14af0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61   this point, tha
14b00 74 20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65  t means the inde
14b10 78 20 70 49 64 78 20 69 73 20 75 73 61 62 6c 65  x pIdx is usable
14b20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
14b30 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
14b40 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
14b50 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
14b60 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14b70 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
14b80 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
14b90 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bb0 20 20 20 22 55 53 49 4e 47 20 49 4e 44 45 58 20     "USING INDEX 
14bc0 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54  %s FOR IN-OPERAT
14bd0 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  OR",pIdx->zName)
14be0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
14bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14c00 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
14c10 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75   iTab, pIdx->tnu
14c20 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
14c30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14c40 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
14c50 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
14c60 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
14c70 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
14c80 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
14c90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
14ca0 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
14cb0 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58  DESC == IN_INDEX
14cc0 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a  _INDEX_ASC+1 );.
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 65 54 79 70              eTyp
14ce0 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  e = IN_INDEX_IND
14cf0 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61  EX_ASC + pIdx->a
14d00 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20 20  SortOrder[0];.  
14d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
14d20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b   prRhsHasNull ){
14d30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14d40 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
14d50 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 20  D_MASK.         
14d60 20 20 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20       i64 mask = 
14d70 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20  (1<<nExpr)-1;.  
14d80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14d90 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
14da0 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55  8(v, OP_ColumnsU
14db0 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20  sed, .          
14dc0 20 20 20 20 20 20 20 20 69 54 61 62 2c 20 30 2c          iTab, 0,
14dd0 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c 20   0, (u8*)&mask, 
14de0 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69  P4_INT64);.#endi
14df0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f.              
14e00 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  *prRhsHasNull = 
14e10 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
14e30 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20  ( nExpr==1 ){.  
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
14e50 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
14e60 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72  lag(v, iTab, *pr
14e70 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20  RhsHasNull);.   
14e80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
14e90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14eb0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
14ec0 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
14ed0 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 45  }.        } /* E
14ee0 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64  nd loop over ind
14ef0 65 78 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20  exes */.      } 
14f00 2f 2a 20 45 6e 64 20 69 66 28 20 61 66 66 69 6e  /* End if( affin
14f10 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20  ity_ok ) */.    
14f20 7d 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20  } /* End if not 
14f30 61 6e 20 72 6f 77 69 64 20 69 6e 64 65 78 20 2a  an rowid index *
14f40 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74  /.  } /* End att
14f50 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65  empt to optimize
14f60 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20   using an index 
14f70 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70  */..  /* If no p
14f80 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  reexisting index
14f90 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   is available fo
14fa0 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a  r the IN clause.
14fb0 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45    ** and IN_INDE
14fc0 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c  X_NOOP is an all
14fd0 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20  owed reply.  ** 
14fe0 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66 20 74  and the RHS of t
14ff0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
15000 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20  s a list, not a 
15010 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e  subquery.  ** an
15020 64 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74  d the RHS is not
15030 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61 73   constant or has
15040 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65   two or fewer te
15050 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69  rms,.  ** then i
15060 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63  t is not worth c
15070 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
15080 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76  eral table to ev
15090 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20  aluate.  ** the 
150a0 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72  IN operator so r
150b0 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e  eturn IN_INDEX_N
150c0 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OOP..  */.  if( 
150d0 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28  eType==0.   && (
150e0 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
150f0 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26  EX_NOOP_OK).   &
15100 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
15110 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
15120 65 63 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c  ect).   && (!sql
15130 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74  ite3InRhsIsConst
15140 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78  ant(pX) || pX->x
15150 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32  .pList->nExpr<=2
15160 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65  ).  ){.    eType
15170 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   = IN_INDEX_NOOP
15180 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79  ;.  }..  if( eTy
15190 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==0 ){.    /* 
151a0 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  Could not find a
151b0 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
151c0 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65   or index to use
151d0 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72   as the RHS b-tr
151e0 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69  ee..    ** We wi
151f0 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72  ll have to gener
15200 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
15210 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65   table to do the
15220 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   job..    */.   
15230 20 75 33 32 20 73 61 76 65 64 4e 51 75 65 72 79   u32 savedNQuery
15240 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
15250 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69  QueryLoop;.    i
15260 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  nt rMayHaveNull 
15270 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 0;.    eType =
15280 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20   IN_INDEX_EPH;. 
15290 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26     if( inFlags &
152a0 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29   IN_INDEX_LOOP )
152b0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
152c0 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a  nQueryLoop = 0;.
152d0 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c        if( pX->pL
152e0 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26  eft->iColumn<0 &
152f0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
15300 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
15310 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
15320 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
15330 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a  _ROWID;.      }.
15340 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72      }else if( pr
15350 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20  RhsHasNull ){.  
15360 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
15370 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  l = rMayHaveNull
15380 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
15390 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  m;.    }.    sql
153a0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
153b0 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d  t(pParse, pX, rM
153c0 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70  ayHaveNull, eTyp
153d0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
153e0 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  D);.    pParse->
153f0 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76  nQueryLoop = sav
15400 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
15410 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69  }else{.    pX->i
15420 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
15430 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61 70 20 26  }..  if( aiMap &
15440 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45  & eType!=IN_INDE
15450 58 5f 49 4e 44 45 58 5f 41 53 43 20 26 26 20 65  X_INDEX_ASC && e
15460 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type!=IN_INDEX_I
15470 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
15480 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e   int i, n;.    n
15490 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
154a0 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65  ctorSize(pX->pLe
154b0 66 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ft);.    for(i=0
154c0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61  ; i<n; i++) aiMa
154d0 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20  p[i] = i;.  }.  
154e0 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a  return eType;.}.
154f0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
15500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
15510 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  UERY./*.** Argum
15520 65 6e 74 20 70 45 78 70 72 20 69 73 20 61 6e 20  ent pExpr is an 
15530 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e  (?, ?...) IN(...
15540 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68  ) expression. Th
15550 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
15560 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65  allocates and re
15570 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d  turns a nul-term
15580 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
15590 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65  ntaining .** the
155a0 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20 62   affinities to b
155b0 65 20 75 73 65 64 20 66 6f 72 20 65 61 63 68 20  e used for each 
155c0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f  column of the co
155d0 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  mparison..**.** 
155e0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
155f0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
15600 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65  caller to ensure
15610 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
15620 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  ed.** string is 
15630 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
15640 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
15650 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Free()..*/.stati
15660 63 20 63 68 61 72 20 2a 65 78 70 72 49 4e 41 66  c char *exprINAf
15670 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50  finity(Parse *pP
15680 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
15690 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  r){.  Expr *pLef
156a0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
156b0 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73  ;.  int nVal = s
156c0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
156d0 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 53  Size(pLeft);.  S
156e0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d  elect *pSelect =
156f0 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
15700 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f   EP_xIsSelect) ?
15710 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
15720 74 20 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t : 0;.  char *z
15730 52 65 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Ret;..  assert( 
15740 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
15750 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c   );.  zRet = sql
15760 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
15770 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c  pParse->db, nVal
15780 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20  +1);.  if( zRet 
15790 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
157a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
157b0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  l; i++){.      E
157c0 78 70 72 20 2a 70 41 20 3d 20 73 71 6c 69 74 65  xpr *pA = sqlite
157d0 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
157e0 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20  xpr(pLeft, i);. 
157f0 20 20 20 20 20 63 68 61 72 20 61 20 3d 20 73 71       char a = sq
15800 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
15810 79 28 70 41 29 3b 0a 20 20 20 20 20 20 69 66 28  y(pA);.      if(
15820 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
15830 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71      zRet[i] = sq
15840 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
15850 6e 69 74 79 28 70 53 65 6c 65 63 74 2d 3e 70 45  nity(pSelect->pE
15860 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
15870 2c 20 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , a);.      }els
15880 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b  e{.        zRet[
15890 69 5d 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a  i] = a;.      }.
158a0 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e      }.    zRet[n
158b0 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  Val] = '\0';.  }
158c0 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
158d0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
158e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
158f0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61  BQUERY./*.** Loa
15900 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  d the Parse obje
15910 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
15920 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
15930 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a  with an error .*
15940 2a 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65  * message of the
15950 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
15960 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
15970 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65  ns N columns - e
15980 78 70 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20  xpected M".*/   
15990 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 75 62  .void sqlite3Sub
159a0 73 65 6c 65 63 74 45 72 72 6f 72 28 50 61 72 73  selectError(Pars
159b0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
159c0 41 63 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70  Actual, int nExp
159d0 65 63 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  ect){.  const ch
159e0 61 72 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d  ar *zFmt = "sub-
159f0 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 25  select returns %
15a00 64 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65  d columns - expe
15a10 63 74 65 64 20 25 64 22 3b 0a 20 20 73 71 6c 69  cted %d";.  sqli
15a20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15a30 73 65 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61  se, zFmt, nActua
15a40 6c 2c 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23  l, nExpect);.}.#
15a50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70  endif../*.** Exp
15a60 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
15a70 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 20 68   a vector that h
15a80 61 73 20 62 65 65 6e 20 75 73 65 64 20 69 6e 20  as been used in 
15a90 61 20 63 6f 6e 74 65 78 74 20 77 68 65 72 65 0a  a context where.
15aa0 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 65 72  ** it is not per
15ab0 6d 69 74 74 65 64 2e 20 49 66 20 70 45 78 70 72  mitted. If pExpr
15ac0 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
15ad0 20 76 65 63 74 6f 72 2c 20 74 68 69 73 20 72 6f   vector, this ro
15ae0 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73 20  utine .** loads 
15af0 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
15b00 20 77 69 74 68 20 61 20 6d 65 73 73 61 67 65 20   with a message 
15b10 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
15b20 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74  **   "sub-select
15b30 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d   returns N colum
15b40 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 31 22  ns - expected 1"
15b50 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 74  .**.** Or, if it
15b60 20 69 73 20 61 20 72 65 67 75 6c 61 72 20 73 63   is a regular sc
15b70 61 6c 61 72 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a  alar vector:.**.
15b80 2a 2a 20 20 20 22 72 6f 77 20 76 61 6c 75 65 20  **   "row value 
15b90 6d 69 73 75 73 65 64 22 0a 2a 2f 20 20 20 0a 76  misused".*/   .v
15ba0 6f 69 64 20 73 71 6c 69 74 65 33 56 65 63 74 6f  oid sqlite3Vecto
15bb0 72 45 72 72 6f 72 4d 73 67 28 50 61 72 73 65 20  rErrorMsg(Parse 
15bc0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
15bd0 45 78 70 72 29 7b 0a 23 69 66 6e 64 65 66 20 53  Expr){.#ifndef S
15be0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
15bf0 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d  ERY.  if( pExpr-
15c00 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
15c10 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
15c20 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
15c30 6f 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  or(pParse, pExpr
15c40 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
15c50 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a  ist->nExpr, 1);.
15c60 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
15c70 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   {.    sqlite3Er
15c80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15c90 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
15ca0 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  d");.  }.}../*.*
15cb0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15cc0 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75  for scalar subqu
15cd0 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20  eries used as a 
15ce0 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73  subquery express
15cf0 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20  ion, EXISTS,.** 
15d00 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e  or IN operators.
15d10 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
15d20 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20  *     (SELECT a 
15d30 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20  FROM b)         
15d40 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20   -- subquery.** 
15d50 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45      EXISTS (SELE
15d60 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d  CT a FROM b)   -
15d70 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72  - EXISTS subquer
15d80 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34  y.**     x IN (4
15d90 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20  ,5,11)          
15da0 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
15db0 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20  or with list on 
15dc0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a  right-hand side.
15dd0 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  **     x IN (SEL
15de0 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
15df0 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
15e00 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f   with subquery o
15e10 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a  n the right.**.*
15e20 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61  * The pExpr para
15e30 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20  meter describes 
15e40 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
15e50 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
15e60 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20   IN.** operator 
15e70 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  or subquery..**.
15e80 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
15e90 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a  isRowid is non-z
15ea0 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73  ero, then expres
15eb0 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75  sion pExpr is gu
15ec0 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
15ed0 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  e of the form "<
15ee0 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c  rowid> IN (?, ?,
15ef0 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77   ?)", where <row
15f00 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e  id> is a referen
15f10 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e  ce.** to some in
15f20 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e  teger key column
15f30 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72   of a table B-Tr
15f40 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
15f50 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b  , use an.** intk
15f60 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f  ey B-Tree to sto
15f70 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e  re the set of IN
15f80 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73  (...) values ins
15f90 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
15fa0 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61  l.** (slower) va
15fb0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65  riable length ke
15fc0 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a  ys B-Tree..**.**
15fd0 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   If rMayHaveNull
15fe0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
15ff0 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
16000 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
16010 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53  n IN.** (not a S
16020 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29  ELECT or EXISTS)
16030 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48   and that the RH
16040 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73  S might contains
16050 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74   NULLs..** All t
16060 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
16070 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   is initialize t
16080 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
16090 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
160a0 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43  l.** to NULL.  C
160b0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  alling routines 
160c0 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f  will take care o
160d0 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
160e0 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75  register.** valu
160f0 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e to non-NULL if
16100 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c   the RHS is NULL
16110 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  -free..**.** For
16120 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
16130 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65  STS operator, re
16140 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
16150 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  r that holds the
16160 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  .** result.  For
16170 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20   a multi-column 
16180 53 45 4c 45 43 54 2c 20 74 68 65 20 72 65 73 75  SELECT, the resu
16190 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  lt is stored in 
161a0 61 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20  a contiguous.** 
161b0 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
161c0 72 73 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  rs and the retur
161d0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 72  n value is the r
161e0 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 20 6c  egister of the l
161f0 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73 75  eft-most.** resu
16200 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 52 65 74 75  lt column.  Retu
16210 72 6e 20 30 20 66 6f 72 20 49 4e 20 6f 70 65 72  rn 0 for IN oper
16220 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65  ators or if an e
16230 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
16240 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16250 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
16260 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
16270 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
16280 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
16290 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
162a0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
162b0 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
162c0 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45   /* The IN, SELE
162d0 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70  CT, or EXISTS op
162e0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
162f0 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20  rHasNullFlag,   
16300 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
16310 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65  that records whe
16320 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74  ther NULLs exist
16330 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74   in RHS */.  int
16340 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20   isRowid        
16350 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
16360 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61   LHS of IN opera
16370 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a  tor is a rowid *
16380 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66  /.){.  int jmpIf
16390 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20  Dynamic = -1;   
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74     /* One-time t
163c0 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20  est address */. 
163d0 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20   int rReg = 0;  
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
16400 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73  ster storing res
16410 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65  ulting */.  Vdbe
16420 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
16430 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
16440 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
16450 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
16460 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
16470 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f  sh(pParse);..  /
16480 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  * The evaluation
16490 20 6f 66 20 74 68 65 20 49 4e 2f 45 58 49 53 54   of the IN/EXIST
164a0 53 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  S/SELECT must be
164b0 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79 20   repeated every 
164c0 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20  time it.  ** is 
164d0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61  encountered if a
164e0 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
164f0 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
16500 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
16510 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
16520 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
16530 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
16540 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
16550 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
16560 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
16570 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
16580 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
16590 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
165a0 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
165b0 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
165c0 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
165d0 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
165e0 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
165f0 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
16600 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
16610 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
16620 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
16630 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
16640 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
16650 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
16660 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
16670 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e   ){.    jmpIfDyn
16680 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 56 64  amic = sqlite3Vd
16690 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
166a0 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
166b0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 73 77  ge(v);.  }..  sw
166c0 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
166d0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
166e0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  N: {.      int a
166f0 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
16700 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16710 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
16720 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
16730 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
16740 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
16750 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48  pLeft; /* the LH
16760 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
16770 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65  ator */.      Ke
16780 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
16790 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79  = 0;      /* Key
167a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
167b0 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20        int nVal; 
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63    /* Size of vec
167e0 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20  tor pLeft */.   
167f0 20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d     .      nVal =
16800 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
16810 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20  orSize(pLeft);. 
16820 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
16830 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31  Rowid || nVal==1
16840 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68   );..      /* Wh
16850 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e  ether this is an
16860 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e   'x IN(SELECT...
16870 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c  )' or an 'x IN(<
16880 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20  exprlist>)'.    
16890 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
168a0 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68  it is handled th
168b0 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20  e same way.  An 
168c0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
168d0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
168e0 6c 65 64 20 77 69 74 68 20 69 6e 64 65 78 20 6b  led with index k
168f0 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
16900 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
16910 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  m the .      ** 
16920 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65  SELECT or the <e
16930 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20  xprlist>..      
16940 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
16950 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f  he 'x' expressio
16960 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
16970 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45  lue, or the SELE
16980 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73  CT....      ** s
16990 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
169a0 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
169b0 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69   then the affini
169c0 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20  ty of that.     
169d0 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73   ** column is us
169e0 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20  ed to build the 
169f0 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62  index keys. If b
16a00 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a  oth 'x' and the.
16a10 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e        ** SELECT.
16a20 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
16a30 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
16a40 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20  umeric affinity 
16a50 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a  is used.      **
16a60 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
16a70 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
16a80 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
16a90 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20  y. If neither.  
16aa0 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74      ** 'x' nor t
16ab0 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  he SELECT... sta
16ac0 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
16ad0 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
16ae0 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20   affinity.      
16af0 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  ** is used..    
16b00 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72    */.      pExpr
16b10 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
16b20 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
16b30 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
16b40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16b50 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a  OpenEphemeral, .
16b60 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
16b70 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69  >iTable, (isRowi
16b80 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20  d?0:nVal));.    
16b90 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52    pKeyInfo = isR
16ba0 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74  owid ? 0 : sqlit
16bb0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
16bc0 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c  Parse->db, nVal,
16bd0 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   1);..      if( 
16be0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16bf0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
16c00 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
16c10 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
16c20 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
16c30 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..).        **. 
16c40 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
16c50 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
16c60 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
16c70 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
16c80 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
16c90 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
16ca0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65  llocated and ope
16cb0 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
16cc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65     */.        Se
16cd0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20  lect *pSelect = 
16ce0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
16cf0 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
16d00 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65  st *pEList = pSe
16d10 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20  lect->pEList;.. 
16d20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
16d30 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
16d40 20 31 2c 20 22 25 73 4c 49 53 54 20 53 55 42 51   1, "%sLIST SUBQ
16d50 55 45 52 59 22 2c 0a 20 20 20 20 20 20 20 20 20  UERY",.         
16d60 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e     jmpIfDynamic>
16d70 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  =0?"":"CORRELATE
16d80 44 20 22 0a 20 20 20 20 20 20 20 20 29 29 3b 0a  D ".        ));.
16d90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16da0 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  !isRowid );.    
16db0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48      /* If the LH
16dc0 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65  S and RHS of the
16dd0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20   IN operator do 
16de0 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a  not match, that.
16df0 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72          ** error
16e00 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
16e10 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f  caught long befo
16e20 72 65 20 77 65 20 72 65 61 63 68 20 74 68 69 73  re we reach this
16e30 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20   point. */.     
16e40 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 45     if( ALWAYS(pE
16e50 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61  List->nExpr==nVa
16e60 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
16e70 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
16e80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
16e90 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16ea0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
16eb0 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74  t(&dest, SRT_Set
16ec0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
16ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 73 74  ;.          dest
16ee0 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70 72  .zAffSdst = expr
16ef0 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  INAffinity(pPars
16f00 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
16f10 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c       pSelect->iL
16f20 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
16f30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
16f40 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
16f50 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  & SF_Distinct );
16f60 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
16f70 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30  ase( pKeyInfo==0
16f80 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79   ); /* Caused by
16f90 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b   OOM in sqlite3K
16fa0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f  eyInfoAlloc() */
16fb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
16fc0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
16fd0 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
16fe0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
16ff0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
17000 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65  e(pParse->db, de
17010 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20  st.zAffSdst);.  
17020 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17030 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
17040 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  eyInfo);.       
17050 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
17060 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17070 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
17080 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64  ee(pParse->db, d
17090 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20  est.zAffSdst);. 
170a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
170b0 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20   pKeyInfo!=0 ); 
170c0 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  /* OOM will caus
170d0 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c  e exit after sql
170e0 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a  ite3Select() */.
170f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17100 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
17110 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17120 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
17130 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
17140 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
17150 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
17160 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20  pKeyInfo) );.   
17170 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
17180 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVal; i++){.  
17190 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
171a0 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
171b0 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
171c0 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  eft, i);.       
171d0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
171e0 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
171f0 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
17200 6c 6c 53 65 71 28 0a 20 20 20 20 20 20 20 20 20  llSeq(.         
17210 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
17220 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
17230 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20  Expr.           
17240 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
17250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17260 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
17270 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21  (pExpr->x.pList!
17280 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =0) ){.        /
17290 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
172a0 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
172b0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
172c0 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20      ** For each 
172d0 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
172e0 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
172f0 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
17300 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
17310 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
17320 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
17330 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
17340 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
17350 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
17360 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
17370 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
17380 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
17390 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
173a0 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
173b0 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
173c0 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
173d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61    */.        cha
173e0 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
173f0 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
17400 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66  ty of the LHS of
17410 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20   the IN */.     
17420 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
17430 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
17440 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
17450 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75  st;.        stru
17460 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
17470 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20   *pItem;.       
17480 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
17490 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74  .        affinit
174a0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
174b0 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a  ffinity(pLeft);.
174c0 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
174d0 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
174e0 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
174f0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
17500 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17510 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
17520 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17530 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
17540 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
17550 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
17560 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
17570 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
17580 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
17590 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
175a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
175b0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
175c0 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
175d0 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
175e0 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
175f0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
17600 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
17610 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
17620 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
17630 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
17640 69 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71  if( isRowid ) sq
17650 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17660 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72  v, OP_Blob, 0, r
17670 32 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53 54 41  2, 0, "", P4_STA
17680 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  TIC);.        fo
17690 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r(i=pList->nExpr
176a0 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
176b0 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
176c0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
176d0 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65  Expr *pE2 = pIte
176e0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
176f0 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e      int iValToIn
17700 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  s;..          /*
17710 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
17720 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  on is not consta
17730 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  nt then we will 
17740 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
17750 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65    ** disable the
17760 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67   test that was g
17770 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74  enerated above t
17780 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20  hat makes sure. 
17790 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
177a0 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75   code only execu
177b0 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75  tes once.  Becau
177c0 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e  se for a non-con
177d0 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20  stant.          
177e0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65  ** expression we
177f0 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74   need to rerun t
17800 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69  his code each ti
17810 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  me..          */
17820 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
17830 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26  mpIfDynamic>=0 &
17840 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  & !sqlite3ExprIs
17850 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b  Constant(pE2) ){
17860 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
17870 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
17880 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e  Noop(v, jmpIfDyn
17890 61 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20  amic);.         
178a0 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20     jmpIfDynamic 
178b0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
178c0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
178d0 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
178e0 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
178f0 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
17900 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
17910 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
17920 69 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  id && sqlite3Exp
17930 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20  rIsInteger(pE2, 
17940 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20  &iValToIns) ){. 
17950 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17960 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17970 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45  OP_InsertInt, pE
17980 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
17990 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20   iValToIns);.   
179a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
179b0 20 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73            r3 = s
179c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
179d0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32  rget(pParse, pE2
179e0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
179f0 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29     if( isRowid )
17a00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
17a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17a20 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
17a30 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20  t, r3,.         
17a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17a60 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
17a70 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +2);.           
17a80 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
17a90 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
17aa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17ab0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
17ac0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17ad0 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20   r2, r3);.      
17ae0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17af0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17b00 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17b10 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
17b20 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e  3, 1, r2, &affin
17b30 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
17b40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17b50 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
17b60 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33  hange(pParse, r3
17b70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
17b80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17b90 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
17ba0 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  dxInsert, pExpr-
17bb0 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 2c  >iTable, r2, r3,
17bc0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
17bd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
17be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17bf0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17c00 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17c10 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
17c20 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17c30 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
17c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17c50 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
17c60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17c70 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
17c80 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e  , (void *)pKeyIn
17c90 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
17ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
17cb0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
17cc0 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
17cd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
17ce0 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74  ECT:.    default
17cf0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73  : {.      /* Cas
17d00 65 20 33 3a 20 20 20 20 28 53 45 4c 45 43 54 20  e 3:    (SELECT 
17d10 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20  ... FROM ...).  
17d20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20 20      **     or:  
17d30 20 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20    EXISTS(SELECT 
17d40 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20  ... FROM ...).  
17d50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
17d60 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65  For a SELECT, ge
17d70 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
17d80 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ut the values fo
17d90 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  r all columns of
17da0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69  .      ** the fi
17db0 72 73 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20  rst row into an 
17dc0 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
17dd0 72 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  rs and return th
17de0 65 20 69 6e 64 65 78 20 6f 66 0a 20 20 20 20 20  e index of.     
17df0 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65   ** the first re
17e00 67 69 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a  gister..      **
17e10 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
17e20 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
17e30 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72  write an integer
17e40 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20   0 (not exists) 
17e50 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20 20  or 1 (exists).  
17e60 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65      ** into a re
17e70 67 69 73 74 65 72 20 61 6e 64 20 72 65 74 75 72  gister and retur
17e80 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
17e90 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2a  number..      **
17ea0 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f 74  .      ** In bot
17eb0 68 20 63 61 73 65 73 2c 20 74 68 65 20 71 75 65  h cases, the que
17ec0 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20  ry is augmented 
17ed0 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20  with "LIMIT 1". 
17ee0 20 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20 70   Any .      ** p
17ef0 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74  reexisting limit
17f00 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69 6e   is discarded in
17f10 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65   place of the ne
17f20 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20 20  w LIMIT 1..     
17f30 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
17f40 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20   *pSel;         
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f60 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
17f70 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
17f80 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
17f90 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  t dest;         
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17fb0 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  How to deal with
17fc0 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a   SELECT result *
17fd0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65 67  /.      int nReg
17fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18000 20 52 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   Registers to al
18010 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 20 20 20 20  locate */.      
18020 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20  Expr *pLimit;   
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c 69 6d        /* New lim
18050 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  it expression */
18060 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
18070 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
18080 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
18090 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
180a0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
180b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
180c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
180d0 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  ISTS || pExpr->o
180e0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
180f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
18100 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
18110 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
18120 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65  t) );..      pSe
18130 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
18140 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 6c  lect;.      Expl
18150 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
18160 61 72 73 65 2c 20 31 2c 20 22 25 73 53 43 41 4c  arse, 1, "%sSCAL
18170 41 52 20 53 55 42 51 55 45 52 59 22 2c 0a 20 20  AR SUBQUERY",.  
18180 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44            jmpIfD
18190 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f  ynamic>=0?"":"CO
181a0 52 52 45 4c 41 54 45 44 20 22 29 29 3b 0a 20 20  RRELATED "));.  
181b0 20 20 20 20 6e 52 65 67 20 3d 20 70 45 78 70 72      nReg = pExpr
181c0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
181d0 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e  ? pSel->pEList->
181e0 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20 20 20 20  nExpr : 1;.     
181f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
18200 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c  stInit(&dest, 0,
18210 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29   pParse->nMem+1)
18220 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
18230 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
18240 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
18250 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
18260 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
18270 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
18280 20 20 20 20 20 20 64 65 73 74 2e 69 53 64 73 74        dest.iSdst
18290 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
182a0 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 6e 53  .        dest.nS
182b0 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  dst = nReg;.    
182c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
182d0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
182e0 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
182f0 6d 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2b  m, dest.iSDParm+
18300 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20 20 20 20  nReg-1);.       
18310 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18320 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
18330 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
18340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18350 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
18360 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
18370 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18380 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
18390 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
183a0 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
183b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
183c0 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
183d0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
183e0 20 20 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74    pLimit = sqlit
183f0 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72  e3ExprAlloc(pPar
18400 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47  se->db, TK_INTEG
18410 45 52 2c 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  ER,&sqlite3IntTo
18420 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  kens[1], 0);.   
18430 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 4c 69     if( pSel->pLi
18440 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mit ){.        s
18450 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
18460 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
18470 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  l->pLimit->pLeft
18480 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 2d  );.        pSel-
18490 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 3d  >pLimit->pLeft =
184a0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d   pLimit;.      }
184b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53  else{.        pS
184c0 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
184d0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
184e0 2c 20 54 4b 5f 4c 49 4d 49 54 2c 20 70 4c 69 6d  , TK_LIMIT, pLim
184f0 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  it, 0);.      }.
18500 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d        pSel->iLim
18510 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  it = 0;.      if
18520 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
18530 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64  pParse, pSel, &d
18540 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
18550 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
18560 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64  }.      rReg = d
18570 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
18580 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
18590 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
185a0 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
185b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
185c0 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c  }..  if( rHasNul
185d0 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c  lFlag ){.    sql
185e0 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
185f0 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61  ag(v, pExpr->iTa
18600 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61  ble, rHasNullFla
18610 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a  g);.  }..  if( j
18620 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29  mpIfDynamic>=0 )
18630 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
18640 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70  eJumpHere(v, jmp
18650 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a  IfDynamic);.  }.
18660 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
18670 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a  hePop(pParse);..
18680 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d    return rReg;.}
18690 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
186a0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
186b0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
186c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
186d0 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20  ./*.** Expr pIn 
186e0 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78  is an IN(...) ex
186f0 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66  pression. This f
18700 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74  unction checks t
18710 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d  hat the .** sub-
18720 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48  select on the RH
18730 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70  S of the IN() op
18740 65 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73  erator has the s
18750 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  ame number of .*
18760 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65  * columns as the
18770 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
18780 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52  HS. Or, if the R
18790 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69  HS of the IN() i
187a0 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d  s not .** a sub-
187b0 71 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20  query, that the 
187c0 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20  LHS is a vector 
187d0 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e  of size 1..*/.in
187e0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
187f0 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72  ckIN(Parse *pPar
18800 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a  se, Expr *pIn){.
18810 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20    int nVector = 
18820 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
18830 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74  rSize(pIn->pLeft
18840 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66  );.  if( (pIn->f
18850 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
18860 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ect) ){.    if( 
18870 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e  nVector!=pIn->x.
18880 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
18890 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
188a0 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
188b0 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49  Error(pParse, pI
188c0 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
188d0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65  List->nExpr, nVe
188e0 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ctor);.      ret
188f0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
18900 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72  else if( nVector
18910 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=1 ){.    sqlit
18920 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67  e3VectorErrorMsg
18930 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c  (pParse, pIn->pL
18940 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  eft);.    return
18950 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
18960 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
18970 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18980 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
18990 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
189a0 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73  or an IN express
189b0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ion..**.**      
189c0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
189d0 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  ).**      x IN (
189e0 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
189f0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  .).**.** The lef
18a00 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53  t-hand side (LHS
18a10 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72  ) is a scalar or
18a20 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
18a30 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67  on.  The .** rig
18a40 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
18a50 53 29 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  S) is an array o
18a60 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73  f zero or more s
18a70 63 61 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72  calar values, or
18a80 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20   a.** subquery. 
18a90 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61   If the RHS is a
18aa0 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e   subquery, the n
18ab0 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
18ac0 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20  columns must.** 
18ad0 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
18ae0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
18af0 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65  he vector on the
18b00 20 4c 48 53 2e 20 20 49 66 20 74 68 65 20 52 48   LHS.  If the RH
18b10 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f  S is.** a list o
18b20 66 20 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48  f values, the LH
18b30 53 20 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c  S must be a scal
18b40 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49  ar. .**.** The I
18b50 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72  N operator is tr
18b60 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 76 61  ue if the LHS va
18b70 6c 75 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  lue is contained
18b80 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
18b90 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
18ba0 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c  s false if the L
18bb0 48 53 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79  HS is definitely
18bc0 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e   not in the RHS.
18bd0 20 20 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74    The .** result
18be0 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
18bf0 70 72 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20  presence of the 
18c00 4c 48 53 20 69 6e 20 74 68 65 20 52 48 53 20 63  LHS in the RHS c
18c10 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74  annot be .** det
18c20 65 72 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e  ermined due to N
18c30 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ULLs..**.** This
18c40 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
18c50 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d  es code that jum
18c60 70 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73  ps to destIfFals
18c70 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
18c80 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65  not .** containe
18c90 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
18ca0 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c  .  If due to NUL
18cb0 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74  Ls we cannot det
18cc0 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48  ermine if the LH
18cd0 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65  S.** is containe
18ce0 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  d in the RHS the
18cf0 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  n jump to destIf
18d00 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48  Null.  If the LH
18d10 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  S is contained.*
18d20 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  * within the RHS
18d30 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
18d40 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68  gh..**.** See th
18d50 65 20 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70  e separate in-op
18d60 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65  erator.md docume
18d70 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20  ntation file in 
18d80 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a  the canonical.**
18d90 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74   SQLite source t
18da0 72 65 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ree for addition
18db0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
18dc0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
18dd0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
18de0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
18df0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
18e00 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
18e10 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
18e20 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
18e30 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
18e40 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  he IN expression
18e50 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
18e60 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a  False,      /* J
18e70 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20  ump here if LHS 
18e80 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
18e90 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   in the RHS */. 
18ea0 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
18eb0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
18ec0 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  ere if the resul
18ed0 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64  ts are unknown d
18ee0 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29  ue to NULLs */.)
18ef0 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e  {.  int rRhsHasN
18f00 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67  ull = 0;  /* Reg
18f10 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72  ister that is tr
18f20 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69  ue if RHS contai
18f30 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a  ns NULL values *
18f40 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
18f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
18f60 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a  e of the RHS */.
18f70 20 20 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20    int rLhs;     
18f80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
18f90 74 65 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74  ter(s) holding t
18fa0 68 65 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f  he LHS values */
18fb0 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b  .  int rLhsOrig;
18fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20           /* LHS 
18fd0 76 61 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20  values prior to 
18fe0 72 65 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69  reordering by ai
18ff0 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20  Map[] */.  Vdbe 
19000 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
19010 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e   /* Statement un
19020 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
19030 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
19040 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d   = 0;       /* M
19050 61 70 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66  ap from vector f
19060 69 65 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f  ield to index co
19070 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
19080 7a 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  zAff = 0;       
19090 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
190a0 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ng for compariso
190b0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63  ns */.  int nVec
190c0 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tor;          /*
190d0 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73   Size of vectors
190e0 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65   for this IN ope
190f0 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
19100 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20  Dummy;          
19110 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65   /* Dummy parame
19120 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56  ter to exprCodeV
19130 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70  ector() */.  Exp
19140 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  r *pLeft;       
19150 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66     /* The LHS of
19160 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
19170 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
19180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
19190 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
191a0 20 69 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20   int destStep2; 
191b0 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
191c0 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c  to jump when NUL
191d0 4c 73 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20  Ls seen in step 
191e0 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53  2 */.  int destS
191f0 74 65 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tep6 = 0;    /* 
19200 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f  Start of code fo
19210 72 20 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e  r Step 6 */.  in
19220 74 20 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20  t addrTruthOp;  
19230 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19240 66 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65  f opcode that de
19250 74 65 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20  termines the IN 
19260 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
19270 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20   destNotNull;   
19280 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
19290 69 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  if a comparison 
192a0 69 73 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73  is not true in s
192b0 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61  tep 6 */.  int a
192c0 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
192d0 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73   /* Top of the s
192e0 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a  tep-6 loop */ ..
192f0 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
19300 3e 70 4c 65 66 74 3b 0a 20 20 69 66 28 20 73 71  >pLeft;.  if( sq
19310 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e  lite3ExprCheckIN
19320 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 20  (pParse, pExpr) 
19330 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66  ) return;.  zAff
19340 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74   = exprINAffinit
19350 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  y(pParse, pExpr)
19360 3b 0a 20 20 6e 56 65 63 74 6f 72 20 3d 20 73 71  ;.  nVector = sq
19370 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
19380 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ize(pExpr->pLeft
19390 29 3b 0a 20 20 61 69 4d 61 70 20 3d 20 28 69 6e  );.  aiMap = (in
193a0 74 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  t*)sqlite3DbMall
193b0 6f 63 5a 65 72 6f 28 0a 20 20 20 20 20 20 70 50  ocZero(.      pP
193c0 61 72 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f  arse->db, nVecto
193d0 72 2a 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b  r*(sizeof(int) +
193e0 20 73 69 7a 65 6f 66 28 63 68 61 72 29 29 20 2b   sizeof(char)) +
193f0 20 31 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 50   1.  );.  if( pP
19400 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
19410 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 71  Failed ) goto sq
19420 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
19430 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a  oom_error;..  /*
19440 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70   Attempt to comp
19450 75 74 65 20 74 68 65 20 52 48 53 2e 20 41 66 74  ute the RHS. Aft
19460 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 69 66  er this step, if
19470 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
19480 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44  than.  ** IN_IND
19490 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72  EX_NOOP is retur
194a0 6e 65 64 2c 20 74 68 65 20 74 61 62 6c 65 20 6f  ned, the table o
194b0 70 65 6e 65 64 20 69 74 68 20 63 75 72 73 6f 72  pened ith cursor
194c0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 0a   pExpr->iTable .
194d0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
194e0 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
194f0 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 20 49  ke up the RHS. I
19500 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  f IN_INDEX_NOOP 
19510 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a  is returned,.  *
19520 2a 20 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f  * the RHS has no
19530 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64  t yet been coded
19540 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  .  */.  v = pPar
19550 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
19560 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
19570 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74     /* OOM detect
19580 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ed prior to this
19590 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64   routine */.  Vd
195a0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
195b0 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72  , "begin IN expr
195c0 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73  "));.  eType = s
195d0 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
195e0 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  x(pParse, pExpr,
195f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
19610 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
19620 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  P | IN_INDEX_NOO
19630 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20  P_OK,.          
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19650 20 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d     destIfFalse==
19660 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a  destIfNull ? 0 :
19670 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 61   &rRhsHasNull, a
19680 69 4d 61 70 29 3b 0a 0a 20 20 61 73 73 65 72 74  iMap);..  assert
19690 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
196a0 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20  | nVector==1 || 
196b0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
196c0 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  EPH.       || eT
196d0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
196e0 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65  DEX_ASC || eType
196f0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
19700 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64  _DESC .  );.#ifd
19710 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
19720 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61    /* Confirm tha
19730 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69  t aiMap[] contai
19740 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67  ns nVector integ
19750 65 72 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  er values betwee
19760 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65  n 0 and.  ** nVe
19770 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72  ctor-1. */.  for
19780 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
19790 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
197a0 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63  , cnt;.    for(c
197b0 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f  nt=j=0; j<nVecto
197c0 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61  r; j++) if( aiMa
197d0 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b  p[j]==i ) cnt++;
197e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6e 74  .    assert( cnt
197f0 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ==1 );.  }.#endi
19800 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  f..  /* Code the
19810 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e   LHS, the <expr>
19820 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
19830 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20   (...)". If the 
19840 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76  LHS is a .  ** v
19850 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69  ector, then it i
19860 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  s stored in an a
19870 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20  rray of nVector 
19880 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
19890 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a  ng .  ** at r1..
198a0 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65    **.  ** sqlite
198b0 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d  3FindInIndex() m
198c0 69 67 68 74 20 68 61 76 65 20 72 65 6f 72 64 65  ight have reorde
198d0 72 65 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f  red the fields o
198e0 66 20 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72  f the LHS vector
198f0 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  .  ** so that th
19900 65 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20  e fields are in 
19910 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61  the same order a
19920 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e  s an existing in
19930 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20  dex.   The.  ** 
19940 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f  aiMap[] array co
19950 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67  ntains a mapping
19960 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
19970 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64  al LHS field ord
19980 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66  er to.  ** the f
19990 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20  ield order that 
199a0 6d 61 74 63 68 65 73 20 74 68 65 20 52 48 53 20  matches the RHS 
199b0 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  index..  */.  sq
199c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
199d0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72 4c  sh(pParse);.  rL
199e0 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64  hsOrig = exprCod
199f0 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
19a00 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b  pLeft, &iDummy);
19a10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
19a20 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69  ector && aiMap[i
19a30 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20  ]==i; i++){} /* 
19a40 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72  Are LHS fields r
19a50 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69  eordered? */.  i
19a60 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b  f( i==nVector ){
19a70 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c  .    /* LHS fiel
19a80 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64  ds are not reord
19a90 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73  ered */.    rLhs
19aa0 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d   = rLhsOrig;.  }
19ab0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  else{.    /* Nee
19ac0 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65  d to reorder the
19ad0 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f   LHS fields acco
19ae0 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a  rding to aiMap *
19af0 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c  /.    rLhs = sql
19b00 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
19b10 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72  (pParse, nVector
19b20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
19b30 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
19b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19b50 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
19b60 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c  opy, rLhsOrig+i,
19b70 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20   rLhs+aiMap[i], 
19b80 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
19b90 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69   /* If sqlite3Fi
19ba0 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20  ndInIndex() did 
19bb0 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61  not find or crea
19bc0 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  te an index that
19bd0 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c   is.  ** suitabl
19be0 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  e for evaluating
19bf0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
19c00 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
19c10 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71  using a.  ** seq
19c20 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
19c30 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  sons..  **.  ** 
19c40 54 68 69 73 20 69 73 20 73 74 65 70 20 28 31 29  This is step (1)
19c50 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61   in the in-opera
19c60 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64  tor.md optimized
19c70 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f   algorithm..  */
19c80 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e  .  if( eType==IN
19c90 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20  _INDEX_NOOP ){. 
19ca0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
19cb0 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
19cc0 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  ist;.    CollSeq
19cd0 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
19ce0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
19cf0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
19d00 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65  t);.    int labe
19d10 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lOk = sqlite3Vdb
19d20 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
19d30 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f     int r2, regTo
19d40 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65  Free;.    int re
19d50 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  gCkNull = 0;.   
19d60 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73   int ii;.    ass
19d70 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
19d80 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
19d90 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
19da0 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c    if( destIfNull
19db0 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  !=destIfFalse ){
19dc0 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c  .      regCkNull
19dd0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19de0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19df0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19e00 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41  ddOp3(v, OP_BitA
19e10 6e 64 2c 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20  nd, rLhs, rLhs, 
19e20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
19e30 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
19e40 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ii<pList->nExpr;
19e50 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32   ii++){.      r2
19e60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
19e70 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
19e80 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
19e90 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a  r, &regToFree);.
19ea0 20 20 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e        if( regCkN
19eb0 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78  ull && sqlite3Ex
19ec0 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73  prCanBeNull(pLis
19ed0 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20  t->a[ii].pExpr) 
19ee0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19ef0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19f00 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b  OP_BitAnd, regCk
19f10 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e  Null, r2, regCkN
19f20 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
19f30 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74      if( ii<pList
19f40 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73  ->nExpr-1 || des
19f50 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46  tIfNull!=destIfF
19f60 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alse ){.        
19f70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19f80 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73  4(v, OP_Eq, rLhs
19f90 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20  , labelOk, r2,. 
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fb0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
19fc0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
19fd0 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  Q);.        Vdbe
19fe0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69  CoverageIf(v, ii
19ff0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  <pList->nExpr-1)
1a000 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
1a010 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d  verageIf(v, ii==
1a020 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b  pList->nExpr-1);
1a030 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a040 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1a050 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20  zAff[0]);.      
1a060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
1a070 73 73 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c  ssert( destIfNul
1a080 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l==destIfFalse )
1a090 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a0a0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1a0b0 50 5f 4e 65 2c 20 72 4c 68 73 2c 20 64 65 73 74  P_Ne, rLhs, dest
1a0c0 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20  IfFalse, r2,.   
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0e0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
1a0f0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
1a100 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a110 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a120 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1a130 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49  , zAff[0] | SQLI
1a140 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1a150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1a160 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a170 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54  Reg(pParse, regT
1a180 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  oFree);.    }.  
1a190 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
1a1a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a1b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a1c0 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75  _IsNull, regCkNu
1a1d0 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
1a1e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a1f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a200 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
1a210 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20  fFalse);.    }. 
1a220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1a230 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1a240 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69  belOk);.    sqli
1a250 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1a260 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e  g(pParse, regCkN
1a270 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73  ull);.    goto s
1a280 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
1a290 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a  _finished;.  }..
1a2a0 20 20 2f 2a 20 53 74 65 70 20 32 3a 20 43 68 65    /* Step 2: Che
1a2b0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
1a2c0 20 4c 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e   LHS contains an
1a2d0 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20  y NULL columns. 
1a2e0 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53   If the.  ** LHS
1a2f0 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55   does contain NU
1a300 4c 4c 73 20 74 68 65 6e 20 74 68 65 20 72 65 73  LLs then the res
1a310 75 6c 74 20 6d 75 73 74 20 62 65 20 65 69 74 68  ult must be eith
1a320 65 72 20 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c  er FALSE or NULL
1a330 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74  ..  ** We will t
1a340 68 65 6e 20 73 6b 69 70 20 74 68 65 20 62 69 6e  hen skip the bin
1a350 61 72 79 20 73 65 61 72 63 68 20 6f 66 20 74 68  ary search of th
1a360 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66  e RHS..  */.  if
1a370 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
1a380 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
1a390 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73   destStep2 = des
1a3a0 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73  tIfFalse;.  }els
1a3b0 65 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32  e{.    destStep2
1a3c0 20 3d 20 64 65 73 74 53 74 65 70 36 20 3d 20 73   = destStep6 = s
1a3d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1a3e0 62 65 6c 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f  bel(v);.  }.  fo
1a3f0 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
1a400 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1a410 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
1a420 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
1a430 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29  pExpr->pLeft, i)
1a440 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1a450 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
1a460 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1a470 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a480 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b  OP_IsNull, rLhs+
1a490 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20  i, destStep2);. 
1a4a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1a4b0 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(v);.    }.  }.
1a4c0 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54  .  /* Step 3.  T
1a4d0 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e  he LHS is now kn
1a4e0 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55  own to be non-NU
1a4f0 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61  LL.  Do the bina
1a500 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f  ry search.  ** o
1a510 66 20 74 68 65 20 52 48 53 20 75 73 69 6e 67 20  f the RHS using 
1a520 74 68 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f  the LHS as a pro
1a530 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74  be.  If found, t
1a540 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a  he result is.  *
1a550 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69  * true..  */.  i
1a560 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
1a570 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
1a580 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
1a590 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20   the RHS is the 
1a5a0 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62  ROWID of table b
1a5b0 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20  -tree and so we 
1a5c0 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77  also.    ** know
1a5d0 20 74 68 61 74 20 74 68 65 20 52 48 53 20 69 73   that the RHS is
1a5e0 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63   non-NULL.  Henc
1a5f0 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74  e, we combine st
1a600 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20  eps 3 and 4.    
1a610 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ** into a single
1a620 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
1a630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a640 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
1a650 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
1a660 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
1a670 4c 68 73 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Lhs);.    VdbeCo
1a680 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61  verage(v);.    a
1a690 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c  ddrTruthOp = sql
1a6a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1a6b0 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20  , OP_Goto);  /* 
1a6c0 52 65 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20  Return True */. 
1a6d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1a6e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a6f0 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c   OP_Affinity, rL
1a700 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20  hs, nVector, 0, 
1a710 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a  zAff, nVector);.
1a720 20 20 20 20 69 66 28 20 64 65 73 74 49 66 46 61      if( destIfFa
1a730 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
1a740 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62  ){.      /* Comb
1a750 69 6e 65 20 53 74 65 70 20 33 20 61 6e 64 20 53  ine Step 3 and S
1a760 74 65 70 20 35 20 69 6e 74 6f 20 61 20 73 69 6e  tep 5 into a sin
1a770 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  gle opcode */.  
1a780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a790 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
1a7a0 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  otFound, pExpr->
1a7b0 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
1a7c0 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lse,.           
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7e0 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20  rLhs, nVector); 
1a7f0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a800 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69  .      goto sqli
1a810 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69  te3ExprCodeIN_fi
1a820 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
1a830 20 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74    /* Ordinary St
1a840 65 70 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61  ep 3, for the ca
1a850 73 65 20 77 68 65 72 65 20 46 41 4c 53 45 20 61  se where FALSE a
1a860 6e 64 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74  nd NULL are dist
1a870 69 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72  inct */.    addr
1a880 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65  TruthOp = sqlite
1a890 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1a8a0 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
1a8b0 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 0a 20 20  r->iTable, 0,.  
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8e0 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f      rLhs, nVecto
1a8f0 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
1a900 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  (v);.  }..  /* S
1a910 74 65 70 20 34 2e 20 20 49 66 20 74 68 65 20 52  tep 4.  If the R
1a920 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62  HS is known to b
1a930 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77  e non-NULL and w
1a940 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20  e did not find. 
1a950 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20   ** an match on 
1a960 74 68 65 20 73 65 61 72 63 68 20 61 62 6f 76 65  the search above
1a970 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
1a980 74 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45 2e  t must be FALSE.
1a990 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 52 68 73  .  */.  if( rRhs
1a9a0 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74  HasNull && nVect
1a9b0 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  or==1 ){.    sql
1a9c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a9d0 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52  , OP_NotNull, rR
1a9e0 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49  hsHasNull, destI
1a9f0 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 56 64 62  fFalse);.    Vdb
1aa00 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1aa10 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e 20  }..  /* Step 5. 
1aa20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 63 61   If we do not ca
1aa30 72 65 20 61 62 6f 75 74 20 74 68 65 20 64 69 66  re about the dif
1aa40 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1aa50 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41  NULL and.  ** FA
1aa60 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  LSE, then just r
1aa70 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20  eturn false. .  
1aa80 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 46  */.  if( destIfF
1aa90 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
1aaa0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f   ) sqlite3VdbeGo
1aab0 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  to(v, destIfFals
1aac0 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36  e);..  /* Step 6
1aad0 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 72  : Loop through r
1aae0 6f 77 73 20 6f 66 20 74 68 65 20 52 48 53 2e 20  ows of the RHS. 
1aaf0 20 43 6f 6d 70 61 72 65 20 65 61 63 68 20 72 6f   Compare each ro
1ab00 77 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20  w to the LHS..  
1ab10 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70 61 72  ** If any compar
1ab20 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ison is NULL, th
1ab30 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
1ab40 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20   NULL.  If all. 
1ab50 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20   ** comparisons 
1ab60 61 72 65 20 46 41 4c 53 45 20 74 68 65 6e 20 74  are FALSE then t
1ab70 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20  he final result 
1ab80 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20  is FALSE..  **. 
1ab90 20 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c 61 72   ** For a scalar
1aba0 20 4c 48 53 2c 20 69 74 20 69 73 20 73 75 66 66   LHS, it is suff
1abb0 69 63 69 65 6e 74 20 74 6f 20 63 68 65 63 6b 20  icient to check 
1abc0 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 72  just the first r
1abd0 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52  ow.  ** of the R
1abe0 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  HS..  */.  if( d
1abf0 65 73 74 53 74 65 70 36 20 29 20 73 71 6c 69 74  estStep6 ) sqlit
1ac00 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1ac10 65 6c 28 76 2c 20 64 65 73 74 53 74 65 70 36 29  el(v, destStep6)
1ac20 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  ;.  addrTop = sq
1ac30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ac40 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45  v, OP_Rewind, pE
1ac50 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
1ac60 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 56 64 62  tIfFalse);.  Vdb
1ac70 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1ac80 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b  if( nVector>1 ){
1ac90 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  .    destNotNull
1aca0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1acb0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 65  keLabel(v);.  }e
1acc0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20  lse{.    /* For 
1acd0 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62  nVector==1, comb
1ace0 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e 64 20  ine steps 6 and 
1acf0 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79  7 by immediately
1ad00 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a   returning.    *
1ad10 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 66  * FALSE if the f
1ad20 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  irst comparison 
1ad30 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20  is not NULL */. 
1ad40 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d     destNotNull =
1ad50 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
1ad60 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
1ad70 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
1ad80 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43    Expr *p;.    C
1ad90 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
1ada0 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69     int r3 = sqli
1adb0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1adc0 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73  arse);.    p = s
1add0 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
1ade0 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
1adf0 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  i);.    pColl = 
1ae00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1ae10 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
1ae20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ae30 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1ae40 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  n, pExpr->iTable
1ae50 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20 73 71  , i, r3);.    sq
1ae60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1ae70 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69  v, OP_Ne, rLhs+i
1ae80 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72  , destNotNull, r
1ae90 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
1aea0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
1aeb0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
1aec0 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  Q);.    VdbeCove
1aed0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1aee0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1aef0 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
1af00 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1af10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1af20 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c  to, 0, destIfNul
1af30 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f  l);.  if( nVecto
1af40 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>1 ){.    sqlit
1af50 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1af60 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c  el(v, destNotNul
1af70 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1af80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1af90 4e 65 78 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  Next, pExpr->iTa
1afa0 62 6c 65 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  ble, addrTop+1);
1afb0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1afc0 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74  e(v);..    /* St
1afd0 65 70 20 37 3a 20 20 49 66 20 77 65 20 72 65 61  ep 7:  If we rea
1afe0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  ch this point, w
1aff0 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
1b000 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20  result must.    
1b010 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a  ** be false. */.
1b020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b030 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1b040 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
1b050 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
1b060 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72  ps here in order
1b070 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e   to return true.
1b080 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1b090 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1b0a0 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69  rTruthOp);..sqli
1b0b0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69  te3ExprCodeIN_fi
1b0c0 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c  nished:.  if( rL
1b0d0 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73  hs!=rLhsOrig ) s
1b0e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1b0f0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68  pReg(pParse, rLh
1b100 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  s);.  sqlite3Exp
1b110 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1b120 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1b130 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
1b140 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70  r"));.sqlite3Exp
1b150 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f  rCodeIN_oom_erro
1b160 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  r:.  sqlite3DbFr
1b170 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61  ee(pParse->db, a
1b180 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  iMap);.  sqlite3
1b190 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1b1a0 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64  b, zAff);.}.#end
1b1b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1b1c0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
1b1d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b1e0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1b1f0 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  T./*.** Generate
1b200 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
1b210 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
1b220 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
1b230 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69  .** value descri
1b240 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d  bed by z[0..n-1]
1b250 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
1b260 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
1b270 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
1b280 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
1b290 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
1b2a0 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
1b2b0 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
1b2c0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1b2d0 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
1b2e0 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
1b2f0 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
1b300 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
1b310 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
1b320 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62  oid codeReal(Vdb
1b330 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
1b340 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46   *z, int negateF
1b350 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
1b360 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d    if( ALWAYS(z!=
1b370 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  0) ){.    double
1b380 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69   value;.    sqli
1b390 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75  te3AtoF(z, &valu
1b3a0 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
1b3b0 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
1b3c0 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  F8);.    assert(
1b3d0 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76   !sqlite3IsNaN(v
1b3e0 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20  alue) ); /* The 
1b3f0 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72  new AtoF never r
1b400 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20  eturns NaN */.  
1b410 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67    if( negateFlag
1b420 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
1b430 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
1b440 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
1b450 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Real, 0, iMem
1b460 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
1b470 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a  , P4_REAL);.  }.
1b480 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
1b490 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
1b4a0 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
1b4b0 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
1b4c0 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
1b4d0 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
1b4e0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
1b4f0 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e  Mem..**.** Expr.
1b500 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61  u.zToken is alwa
1b510 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f  ys UTF8 and zero
1b520 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a  -terminated..*/.
1b530 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
1b540 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70  Integer(Parse *p
1b550 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1b560 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c  pr, int negFlag,
1b570 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64   int iMem){.  Vd
1b580 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1b590 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78  pVdbe;.  if( pEx
1b5a0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
1b5b0 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
1b5c0 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e  nt i = pExpr->u.
1b5d0 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65  iValue;.    asse
1b5e0 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( i>=0 );.    
1b5f0 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
1b600 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -i;.    sqlite
1b610 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b620 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d  P_Integer, i, iM
1b630 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
1b640 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34    int c;.    i64
1b650 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73   value;.    cons
1b660 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70  t char *z = pExp
1b670 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
1b680 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
1b690 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33  .    c = sqlite3
1b6a0 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c  DecOrHexToI64(z,
1b6b0 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66   &value);.    if
1b6c0 28 20 28 63 3d 3d 33 20 26 26 20 21 6e 65 67 46  ( (c==3 && !negF
1b6d0 6c 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29 20 7c  lag) || (c==2) |
1b6e0 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76 61  | (negFlag && va
1b6f0 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  lue==SMALLEST_IN
1b700 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53 51  T64)){.#ifdef SQ
1b710 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1b720 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73  NG_POINT.      s
1b730 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b740 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65  Parse, "oversize
1b750 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22  d integer: %s%s"
1b760 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20  , negFlag ? "-" 
1b770 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a  : "", z);.#else.
1b780 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b790 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a  MIT_HEX_INTEGER.
1b7a0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1b7b0 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78  3_strnicmp(z,"0x
1b7c0 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",2)==0 ){.     
1b7d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1b7e0 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20  sg(pParse, "hex 
1b7f0 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a  literal too big:
1b800 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f   %s%s", negFlag?
1b810 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20  "-":"",z);.     
1b820 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1b830 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f      {.        co
1b840 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67  deReal(v, z, neg
1b850 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  Flag, iMem);.   
1b860 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1b870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
1b880 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75   negFlag ){ valu
1b890 65 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c  e = c==3 ? SMALL
1b8a0 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c  EST_INT64 : -val
1b8b0 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  ue; }.      sqli
1b8c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
1b8d0 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  8(v, OP_Int64, 0
1b8e0 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29  , iMem, 0, (u8*)
1b8f0 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34  &value, P4_INT64
1b900 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1b910 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 63 6f 6c 75  /*.** Erase colu
1b920 6d 6e 2d 63 61 63 68 65 20 65 6e 74 72 79 20 6e  mn-cache entry n
1b930 75 6d 62 65 72 20 69 0a 2a 2f 0a 73 74 61 74 69  umber i.*/.stati
1b940 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72  c void cacheEntr
1b950 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  yClear(Parse *pP
1b960 61 72 73 65 2c 20 69 6e 74 20 69 29 7b 0a 20 20  arse, int i){.  
1b970 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  if( pParse->aCol
1b980 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67  Cache[i].tempReg
1b990 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
1b9a0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
1b9b0 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
1b9c0 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
1b9d0 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
1b9e0 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
1b9f0 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65 2d  Reg++] = pParse-
1ba00 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52  >aColCache[i].iR
1ba10 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  eg;.    }.  }.  
1ba20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1ba30 65 2d 2d 3b 0a 20 20 69 66 28 20 69 3c 70 50 61  e--;.  if( i<pPa
1ba40 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29  rse->nColCache )
1ba50 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43  {.    pParse->aC
1ba60 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70 50 61  olCache[i] = pPa
1ba70 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 70  rse->aColCache[p
1ba80 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1ba90 5d 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ];.  }.}.../*.**
1baa0 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63   Record in the c
1bab0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74  olumn cache that
1bac0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f   a particular co
1bad0 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70  lumn from a.** p
1bae0 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20  articular table 
1baf0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70  is stored in a p
1bb00 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74  articular regist
1bb10 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
1bb20 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1bb30 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1bb40 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69   int iTab, int i
1bb50 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  Col, int iReg){.
1bb60 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d    int i;.  int m
1bb70 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78  inLru;.  int idx
1bb80 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43  Lru;.  struct yC
1bb90 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 2f  olCache *p;..  /
1bba0 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f  * Unless an erro
1bbb0 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
1bbc0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
1bbd0 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69   are always posi
1bbe0 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tive. */.  asser
1bbf0 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70 50 61  t( iReg>0 || pPa
1bc00 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61  rse->nErr || pPa
1bc10 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1bc20 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72  ailed );.  asser
1bc30 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69  t( iCol>=-1 && i
1bc40 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a  Col<32768 );  /*
1bc50 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e   Finite column n
1bc60 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20  umbers */..  /* 
1bc70 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  The SQLITE_Colum
1bc80 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61  nCache flag disa
1bc90 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  bles the column 
1bca0 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20  cache.  This is 
1bcb0 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65  used.  ** for te
1bcc0 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20  sting only - to 
1bcd0 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69  verify that SQLi
1bce0 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74  te always gets t
1bcf0 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20  he same answer. 
1bd00 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74   ** with and wit
1bd10 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  hout the column 
1bd20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cache..  */.  if
1bd30 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
1bd40 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  sabled(pParse->d
1bd50 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  b, SQLITE_Column
1bd60 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b  Cache) ) return;
1bd70 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70  ..  /* First rep
1bd80 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e  lace any existin
1bd90 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20  g entry..  **.  
1bda0 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65  ** Actually, the
1bdb0 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20   way the column 
1bdc0 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e 74  cache is current
1bdd0 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65 20  ly used, we are 
1bde0 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20  guaranteed.  ** 
1bdf0 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20  that the object 
1be00 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61  will never alrea
1be10 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20  dy be in cache. 
1be20 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75 61   Verify this gua
1be30 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66  rantee..  */.#if
1be40 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f  ndef NDEBUG.  fo
1be50 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1be60 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50  >aColCache; i<pP
1be70 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
1be80 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1be90 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c  assert( p->iTabl
1bea0 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43  e!=iTab || p->iC
1beb0 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20  olumn!=iCol );. 
1bec0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
1bed0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 43  f SQLITE_DEBUG_C
1bee0 4f 4c 55 4d 4e 43 41 43 48 45 0a 20 20 2f 2a 20  OLUMNCACHE.  /* 
1bef0 41 64 64 20 61 20 53 65 74 54 61 62 43 6f 6c 20  Add a SetTabCol 
1bf00 6f 70 63 6f 64 65 20 66 6f 72 20 72 75 6e 2d 74  opcode for run-t
1bf10 69 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ime verification
1bf20 20 74 68 61 74 20 74 68 65 20 63 6f 6c 75 6d 6e   that the column
1bf30 0a 20 20 2a 2a 20 63 61 63 68 65 20 69 73 20 77  .  ** cache is w
1bf40 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c 79  orking correctly
1bf50 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1bf60 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
1bf70 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 65 74  e->pVdbe, OP_Set
1bf80 54 61 62 43 6f 6c 2c 20 69 54 61 62 2c 20 69 43  TabCol, iTab, iC
1bf90 6f 6c 2c 20 69 52 65 67 29 3b 0a 23 65 6e 64 69  ol, iReg);.#endi
1bfa0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  f..  /* If the c
1bfb0 61 63 68 65 20 69 73 20 61 6c 72 65 61 64 79 20  ache is already 
1bfc0 66 75 6c 6c 2c 20 64 65 6c 65 74 65 20 74 68 65  full, delete the
1bfd0 20 6c 65 61 73 74 20 72 65 63 65 6e 74 6c 79 20   least recently 
1bfe0 75 73 65 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20  used entry */.  
1bff0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  if( pParse->nCol
1c000 43 61 63 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f  Cache>=SQLITE_N_
1c010 43 4f 4c 43 41 43 48 45 20 29 7b 0a 20 20 20 20  COLCACHE ){.    
1c020 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66  minLru = 0x7ffff
1c030 66 66 66 3b 0a 20 20 20 20 69 64 78 4c 72 75 20  fff;.    idxLru 
1c040 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = -1;.    for(i=
1c050 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1c060 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
1c070 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
1c080 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , p++){.      if
1c090 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20  ( p->lru<minLru 
1c0a0 29 7b 0a 20 20 20 20 20 20 20 20 69 64 78 4c 72  ){.        idxLr
1c0b0 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 6d  u = i;.        m
1c0c0 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a  inLru = p->lru;.
1c0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c0e0 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
1c0f0 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
1c100 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c110 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
1c120 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43  Cache[pParse->nC
1c130 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a  olCache++];.  }.
1c140 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65  .  /* Add the ne
1c150 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 65  w entry to the e
1c160 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  nd of the cache 
1c170 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  */.  p->iLevel =
1c180 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1c190 65 76 65 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  evel;.  p->iTabl
1c1a0 65 20 3d 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69  e = iTab;.  p->i
1c1b0 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
1c1c0 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
1c1d0 0a 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20  .  p->tempReg = 
1c1e0 30 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50  0;.  p->lru = pP
1c1f0 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
1c200 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  +;.}../*.** Indi
1c210 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74  cate that regist
1c220 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67  ers between iReg
1c230 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72  ..iReg+nReg-1 ar
1c240 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
1c250 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68  ten..** Purge th
1c260 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  e range of regis
1c270 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  ters from the co
1c280 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76  lumn cache..*/.v
1c290 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1c2a0 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65  acheRemove(Parse
1c2b0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1c2c0 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
1c2d0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68   int i = 0;.  wh
1c2e0 69 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e  ile( i<pParse->n
1c2f0 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ColCache ){.    
1c300 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1c310 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61   *p = &pParse->a
1c320 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20  ColCache[i];.   
1c330 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20   if( p->iReg >= 
1c340 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65 67 20  iReg && p->iReg 
1c350 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20  < iReg+nReg ){. 
1c360 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
1c370 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b  lear(pParse, i);
1c380 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c390 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    i++;.    }.  }
1c3a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
1c3b0 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  er the current c
1c3c0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74  olumn cache cont
1c3d0 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e  ext.  Any new en
1c3e0 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61  tries added.** a
1c3f0 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75  dded to the colu
1c400 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74  mn cache after t
1c410 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d  his call are rem
1c420 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  oved when the.**
1c430 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
1c440 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  op occurs..*/.vo
1c450 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1c460 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70  chePush(Parse *p
1c470 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
1c480 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b  ->iCacheLevel++;
1c490 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1c4a0 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1c4b0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1c4c0 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1c4d0 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1c4e0 74 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e  tf("PUSH to %d\n
1c4f0 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
1c500 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
1c510 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
1c520 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ove from the col
1c530 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e  umn cache any en
1c540 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  tries that were 
1c550 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a  added since the.
1c560 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ** the previous 
1c570 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c580 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Push operation. 
1c590 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1c5a0 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20   restore.** the 
1c5b0 63 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61  cache to the sta
1c5c0 74 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69  te it was in pri
1c5d0 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
1c5e0 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64  nt Push..*/.void
1c5f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c600 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
1c610 73 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30  se){.  int i = 0
1c620 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1c630 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e  se->iCacheLevel>
1c640 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =1 );.  pParse->
1c650 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23  iCacheLevel--;.#
1c660 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c670 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1c680 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1c690 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1c6a0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1c6b0 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c  ("POP  to %d\n",
1c6c0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1c6d0 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
1c6e0 66 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61  f.  while( i<pPa
1c6f0 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29  rse->nColCache )
1c700 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
1c710 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
1c720 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43  Level>pParse->iC
1c730 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20  acheLevel ){.   
1c740 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
1c750 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ar(pParse, i);. 
1c760 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c770 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  i++;.    }.  }.}
1c780 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63  ../*.** When a c
1c790 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  ached column is 
1c7a0 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72  reused, make sur
1c7b0 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73  e that its regis
1c7c0 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e  ter is.** no lon
1c7d0 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73  ger available as
1c7e0 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72   a temp register
1c7f0 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a  .  ticket #3879:
1c800 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72    that same.** r
1c810 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65  egister might be
1c820 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e   in the cache in
1c830 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
1c840 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a  , so be sure to.
1c850 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e  ** get them all.
1c860 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c870 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c880 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73  PinRegister(Pars
1c890 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1c8a0 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
1c8b0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1c8c0 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
1c8d0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1c8e0 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e  ache; i<pParse->
1c8f0 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20  nColCache; i++, 
1c900 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
1c910 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
1c920 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
1c930 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
1c940 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1c950 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61  de that will loa
1c960 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  d into register 
1c970 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74  regOut a value t
1c980 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70  hat is.** approp
1c990 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49  riate for the iI
1c9a0 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20  dxCol-th column 
1c9b0 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
1c9c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c9d0 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43  prCodeLoadIndexC
1c9e0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1c9f0 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20  pParse,  /* The 
1ca00 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1ca10 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1ca20 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  ,    /* The inde
1ca30 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69  x whose column i
1ca40 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  s to be loaded *
1ca50 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
1ca60 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1ca70 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  inting to a tabl
1ca80 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  e row */.  int i
1ca90 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68  IdxCol,    /* Th
1caa0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1cab0 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64  index to be load
1cac0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
1cad0 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  ut      /* Store
1cae0 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
1caf0 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  n value in this 
1cb00 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1cb10 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70   i16 iTabCol = p
1cb20 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49  Idx->aiColumn[iI
1cb30 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54  dxCol];.  if( iT
1cb40 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29  abCol==XN_EXPR )
1cb50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
1cb60 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a  dx->aColExpr );.
1cb70 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1cb80 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70  ->aColExpr->nExp
1cb90 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20  r>iIdxCol );.   
1cba0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1cbb0 62 20 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b  b = iTabCur + 1;
1cbc0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1cbd0 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c  CodeCopy(pParse,
1cbe0 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1cbf0 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70  >a[iIdxCol].pExp
1cc00 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20  r, regOut);.    
1cc10 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1cc20 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1cc30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1cc40 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1cc50 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  le(pParse->pVdbe
1cc60 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20  , pIdx->pTable, 
1cc70 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20  iTabCur,.       
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
1cca0 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCol, regOut);. 
1ccb0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1ccc0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
1ccd0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
1cce0 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
1ccf0 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
1cd00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1cd10 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1cd20 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
1cd30 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
1cd40 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
1cd50 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1cd60 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1cd70 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
1cd80 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
1cd90 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
1cda0 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ur,    /* The ta
1cdb0 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20  ble cursor.  Or 
1cdc0 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f  the PK cursor fo
1cdd0 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
1cde0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
1cdf0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1ce00 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
1ce10 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
1ce20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
1ce30 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1ce40 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
1ce50 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
1ce60 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
1ce70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1ce80 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
1ce90 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65  TabCur, iCol, re
1cea0 67 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72  gOut);.    retur
1ceb0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  n;.  }.  if( iCo
1cec0 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61  l<0 || iCol==pTa
1ced0 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
1cee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cef0 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
1cf00 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b  TabCur, regOut);
1cf10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1cf20 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
1cf30 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
1cf40 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
1cf50 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f  .    int x = iCo
1cf60 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52  l;.    if( !HasR
1cf70 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 21 49  owid(pTab) && !I
1cf80 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1cf90 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69  {.      x = sqli
1cfa0 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1cfb0 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  (sqlite3PrimaryK
1cfc0 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69  eyIndex(pTab), i
1cfd0 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
1cfe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cff0 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72  3(v, op, iTabCur
1d000 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  , x, regOut);.  
1d010 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
1d020 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
1d030 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
1d040 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Tab, iCol, regOu
1d050 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1d060 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1d070 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
1d080 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
1d090 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
1d0a0 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
1d0b0 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
1d0c0 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74  alue in a regist
1d0d0 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66  er. .**.** An ef
1d0e0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
1d0f0 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
1d100 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
1d110 65 72 20 69 52 65 67 2e 20 20 54 68 69 73 0a 2a  er iReg.  This.*
1d120 2a 20 69 73 20 6e 6f 74 20 67 61 72 61 6e 74 65  * is not garante
1d130 65 65 64 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d  eed for GetColum
1d140 6e 28 29 20 2d 20 74 68 65 20 72 65 73 75 6c 74  n() - the result
1d150 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69   can be stored i
1d160 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73 74 65  n.** any registe
1d170 72 2e 20 20 42 75 74 20 74 68 65 20 72 65 73 75  r.  But the resu
1d180 6c 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  lt is guaranteed
1d190 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67 69   to land in regi
1d1a0 73 74 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72  ster iReg.** for
1d1b0 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28   GetColumnToReg(
1d1c0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  )..**.** There m
1d1d0 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
1d1e0 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
1d1f0 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
1d200 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
1d210 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
1d220 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
1d230 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
1d240 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
1d250 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
1d260 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1d270 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1d280 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
1d290 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1d2a0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1d2b0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1d2c0 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
1d2d0 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
1d2e0 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
1d2f0 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
1d300 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
1d310 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
1d320 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
1d330 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1d340 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
1d350 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
1d360 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
1d370 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g,        /* Sto
1d380 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
1d390 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20  */.  u8 p5      
1d3a0 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75        /* P5 valu
1d3b0 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e for OP_Column 
1d3c0 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20  + FLAGS */.){.  
1d3d0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1d3e0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1d3f0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
1d400 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28  ache *p;..  for(
1d410 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1d420 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1d430 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1d440 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
1d450 28 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ( p->iTable==iTa
1d460 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ble && p->iColum
1d470 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n==iColumn ){.  
1d480 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
1d490 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
1d4a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1d4b0 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
1d4c0 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69  ter(pParse, p->i
1d4d0 52 65 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Reg);.#ifdef SQL
1d4e0 49 54 45 5f 44 45 42 55 47 5f 43 4f 4c 55 4d 4e  ITE_DEBUG_COLUMN
1d4f0 43 41 43 48 45 0a 20 20 20 20 20 20 73 71 6c 69  CACHE.      sqli
1d500 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1d510 20 4f 50 5f 56 65 72 69 66 79 54 61 62 43 6f 6c   OP_VerifyTabCol
1d520 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
1d530 6e 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 23 65 6e  n, p->iReg);.#en
1d540 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
1d550 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
1d560 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
1d570 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
1d580 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1d590 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61  mnOfTable(v, pTa
1d5a0 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  b, iTable, iColu
1d5b0 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28  mn, iReg);.  if(
1d5c0 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   p5 ){.    sqlit
1d5d0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1d5e0 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  , p5);.  }else{ 
1d5f0 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78    .    sqlite3Ex
1d600 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
1d610 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  rse, iTable, iCo
1d620 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d  lumn, iReg);.  }
1d630 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
1d640 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  }.void sqlite3Ex
1d650 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54  prCodeGetColumnT
1d660 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a 70  oReg(.  Parse *p
1d670 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
1d680 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
1d690 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
1d6a0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1d6b0 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
1d6c0 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
1d6d0 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  e we are reading
1d6e0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1d6f0 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49  Column,     /* I
1d700 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
1d710 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  e column */.  in
1d720 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f  t iTable,      /
1d730 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
1d740 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62  nting to the tab
1d750 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
1d760 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
1d770 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
1d780 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  /.){.  int r1 = 
1d790 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1d7a0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1d7b0 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20   pTab, iColumn, 
1d7c0 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30 29  iTable, iReg, 0)
1d7d0 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65 67  ;.  if( r1!=iReg
1d7e0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
1d7f0 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
1d800 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  be, OP_SCopy, r1
1d810 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , iReg);.}.../*.
1d820 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c  ** Clear all col
1d830 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65  umn cache entrie
1d840 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1d850 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
1d860 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1d870 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65  .  int i;..#ifde
1d880 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1d890 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
1d8a0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1d8b0 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
1d8c0 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c  {.    printf("CL
1d8d0 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e  EAR\n");.  }.#en
1d8e0 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  dif.  for(i=0; i
1d8f0 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1d900 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  he; i++){.    if
1d910 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  ( pParse->aColCa
1d920 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67 0a 20  che[i].tempReg. 
1d930 20 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e      && pParse->n
1d940 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
1d950 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
1d960 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  eg).    ){.     
1d970 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
1d980 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
1d990 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65 2d  Reg++] = pParse-
1d9a0 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52  >aColCache[i].iR
1d9b0 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  eg;.    }.  }.  
1d9c0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1d9d0 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
1d9e0 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
1d9f0 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79  that an affinity
1da00 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75   change has occu
1da10 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a  rred on iCount.*
1da20 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  * registers star
1da30 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74  ting with iStart
1da40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1da50 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1da60 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a  tyChange(Parse *
1da70 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61  pParse, int iSta
1da80 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b  rt, int iCount){
1da90 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1daa0 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1dab0 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74  , iStart, iCount
1dac0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1dad0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76  rate code to mov
1dae0 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  e content from r
1daf0 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
1db00 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
1db10 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
1db20 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74  o+nReg-1. Keep t
1db30 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
1db40 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76  up-to-date..*/.v
1db50 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1db60 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70  odeMove(Parse *p
1db70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
1db80 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
1db90 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Reg){.  assert( 
1dba0 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20  iFrom>=iTo+nReg 
1dbb0 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69  || iFrom+nReg<=i
1dbc0 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  To );.  sqlite3V
1dbd0 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
1dbe0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
1dbf0 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
1dc00 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg);.  sqlite3Ex
1dc10 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1dc20 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65  arse, iFrom, nRe
1dc30 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  g);.}..#if defin
1dc40 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1dc50 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1dc60 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
1dc70 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
1dc80 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73  rue if any regis
1dc90 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ter in the range
1dca0 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63   iFrom..iTo (inc
1dcb0 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73  lusive).** is us
1dcc0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1dcd0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
1dce0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1dcf0 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69  ne is used withi
1dd00 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  n assert() and t
1dd10 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
1dd20 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65   only.** and doe
1dd30 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
1dd40 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a  a normal build..
1dd50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73  */.static int us
1dd60 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
1dd70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1dd80 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
1dd90 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  o){.  int i;.  s
1dda0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1ddb0 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
1ddc0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1ddd0 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
1dde0 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
1ddf0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
1de00 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
1de10 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d   r>=iFrom && r<=
1de20 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20  iTo ) return 1; 
1de30 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
1de40 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1de50 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1de60 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54  E_DEBUG || SQLIT
1de70 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20  E_COVERAGE_TEST 
1de80 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  */.../*.** Conve
1de90 72 74 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  rt a scalar expr
1dea0 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61  ession node to a
1deb0 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66   TK_REGISTER ref
1dec0 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69  erencing.** regi
1ded0 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 65 20  ster iReg.  The 
1dee0 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
1def0 72 65 20 74 68 61 74 20 69 52 65 67 20 61 6c 72  re that iReg alr
1df00 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  eady contains.**
1df10 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1df20 75 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ue for the expre
1df30 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssion..*/.static
1df40 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69   void exprToRegi
1df50 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  ster(Expr *p, in
1df60 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70  t iReg){.  p->op
1df70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e  2 = p->op;.  p->
1df80 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
1df90 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20  ;.  p->iTable = 
1dfa0 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61  iReg;.  ExprClea
1dfb0 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  rProperty(p, EP_
1dfc0 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Skip);.}../*.** 
1dfd0 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  Evaluate an expr
1dfe0 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20 61  ession (either a
1dff0 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61   vector or a sca
1e000 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29 20  lar expression) 
1e010 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65  and store.** the
1e020 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69   result in conti
1e030 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72 79  nguous temporary
1e040 20 72 65 67 69 73 74 65 72 73 2e 20 20 52 65 74   registers.  Ret
1e050 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1e060 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65  .** the first re
1e070 67 69 73 74 65 72 20 75 73 65 64 20 74 6f 20 73  gister used to s
1e080 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e  tore the result.
1e090 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
1e0a0 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65  turned result re
1e0b0 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
1e0c0 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74 68  orary scalar, th
1e0d0 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a  en also write.**
1e0e0 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e   that register n
1e0f0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46 72  umber into *piFr
1e100 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65 20  eeable.  If the 
1e110 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20  returned result 
1e120 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e  register.** is n
1e130 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f  ot a temporary o
1e140 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  r if the express
1e150 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72 20  ion is a vector 
1e160 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65 0a  set *piFreeable.
1e170 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74  ** to 0..*/.stat
1e180 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 56  ic int exprCodeV
1e190 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  ector(Parse *pPa
1e1a0 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  rse, Expr *p, in
1e1b0 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b 0a  t *piFreeable){.
1e1c0 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20    int iResult;. 
1e1d0 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20 73   int nResult = s
1e1e0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
1e1f0 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20 6e  Size(p);.  if( n
1e200 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20  Result==1 ){.   
1e210 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   iResult = sqlit
1e220 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e230 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65 65  Parse, p, piFree
1e240 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  able);.  }else{.
1e250 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65 20      *piFreeable 
1e260 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 0;.    if( p->
1e270 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
1e280 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  .#if SQLITE_OMIT
1e290 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
1e2a0 69 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23 65 6c  iResult = 0;.#el
1e2b0 73 65 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74  se.      iResult
1e2c0 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
1e2d0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
1e2e0 70 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  p, 0, 0);.#endif
1e2f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e300 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1e310 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d  Result = pParse-
1e320 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
1e330 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1e340 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f  Result;.      fo
1e350 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=0; i<nResult
1e360 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1e370 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46  sqlite3ExprCodeF
1e380 61 63 74 6f 72 61 62 6c 65 28 70 50 61 72 73 65  actorable(pParse
1e390 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  , p->x.pList->a[
1e3a0 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52 65 73  i].pExpr, i+iRes
1e3b0 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ult);.      }.  
1e3c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1e3d0 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a   iResult;.}.../*
1e3e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1e3f0 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
1e400 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
1e410 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
1e420 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74   expression.  At
1e430 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74  tempt to store t
1e440 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  he results in re
1e450 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e  gister "target".
1e460 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
1e470 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65  egister where re
1e480 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
1e490 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69  ..**.** With thi
1e4a0 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65  s routine, there
1e4b0 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65   is no guarantee
1e4c0 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69   that results wi
1e4d0 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20  ll.** be stored 
1e4e0 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  in target.  The 
1e4f0 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20  result might be 
1e500 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f  stored in some o
1e510 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72  ther.** register
1e520 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e   if it is conven
1e530 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20  ient to do so.  
1e540 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
1e550 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65  tion.** must che
1e560 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  ck the return co
1e570 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  de and move the 
1e580 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64  results to the d
1e590 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74  esired.** regist
1e5a0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1e5b0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1e5c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e5d0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1e5e0 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
1e5f0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1e600 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20  dbe;  /* The VM 
1e610 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1e620 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  on */.  int op; 
1e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e640 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
1e650 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
1e660 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72   int inReg = tar
1e670 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  get;       /* Re
1e680 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20  sults stored in 
1e690 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a  register inReg *
1e6a0 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
1e6b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1e6c0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
1e6d0 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
1e6e0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1e6f0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
1e700 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
1e710 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
1e720 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1e730 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31  ster */.  int r1
1e740 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20 20 20  , r2;           
1e750 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72      /* Various r
1e760 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
1e770 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b  */.  Expr tempX;
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e790 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72  * Temporary expr
1e7a0 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20  ession node */. 
1e7b0 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20   int p5 = 0;..  
1e7c0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1e7d0 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
1e7e0 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
1e7f0 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ( v==0 ){.    as
1e800 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1e810 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1e820 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1e830 20 20 7d 0a 0a 65 78 70 72 5f 63 6f 64 65 5f 64    }..expr_code_d
1e840 6f 6f 76 65 72 3a 0a 20 20 69 66 28 20 70 45 78  oover:.  if( pEx
1e850 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
1e860 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
1e870 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
1e880 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
1e890 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1e8a0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
1e8b0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
1e8c0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
1e8d0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
1e8e0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
1e8f0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
1e900 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
1e910 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
1e920 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
1e930 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
1e940 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1e950 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20  t( pCol->iMem>0 
1e960 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1e970 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20  n pCol->iMem;.  
1e980 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
1e990 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
1e9a0 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
1e9b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e9c0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1e9d0 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
1e9e0 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20  ngIdxPTab,.     
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea00 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1ea10 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
1ea20 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72  rget);.        r
1ea30 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1ea40 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
1ea50 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
1ea60 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
1ea70 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
1ea80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ea90 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
1eaa0 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70   int iTab = pExp
1eab0 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
1eac0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1ead0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
1eae0 69 78 65 64 43 6f 6c 29 20 29 7b 0a 20 20 20 20  ixedCol) ){.    
1eaf0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1eb00 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1eb10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1eb20 70 4c 65 66 74 2c 74 61 72 67 65 74 29 3b 0a 20  pLeft,target);. 
1eb30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1eb40 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
1eb50 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69     if( pParse->i
1eb60 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a 20 20 20  SelfTab<0 ){.   
1eb70 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
1eb80 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74  ting CHECK const
1eb90 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74  raints or insert
1eba0 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c  ing into partial
1ebb0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
1ebc0 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
1ebd0 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72  ->iColumn - pPar
1ebe0 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20  se->iSelfTab;.  
1ebf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ec00 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67         /* Coding
1ec10 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
1ec20 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
1ec30 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f  n index where co
1ec40 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20  lumn names.     
1ec50 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
1ec60 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20 74 68  ndex refer to th
1ec70 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68  e table to which
1ec80 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
1ec90 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  gs */.          
1eca0 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69  iTab = pParse->i
1ecb0 53 65 6c 66 54 61 62 20 2d 20 31 3b 0a 20 20 20  SelfTab - 1;.   
1ecc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ecd0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1ece0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1ecf0 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
1ed00 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20  pr->pTab,.      
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1ed30 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74  iColumn, iTab, t
1ed40 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed60 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
1ed70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
1ed80 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
1ed90 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
1eda0 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
1edb0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1edc0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1edd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ede0 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20 7b   TK_TRUEFALSE: {
1edf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ee00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1ee10 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33 45  nteger, sqlite3E
1ee20 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45  xprTruthValue(pE
1ee30 78 70 72 29 2c 20 74 61 72 67 65 74 29 3b 0a 20  xpr), target);. 
1ee40 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1ee50 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  et;.    }.#ifnde
1ee60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1ee70 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1ee80 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
1ee90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1eea0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1eeb0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1eec0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f  lue) );.      co
1eed0 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d  deReal(v, pExpr-
1eee0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61  >u.zToken, 0, ta
1eef0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1ef00 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1ef10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1ef20 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
1ef30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1ef40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ef50 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1ef60 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1ef70 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
1ef80 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70  (v, target, pExp
1ef90 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1efa0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1efb0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
1efc0 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
1efd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1efe0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1eff0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1f000 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1f010 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1f020 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1f030 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1f040 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
1f050 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1f060 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
1f070 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
1f080 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f090 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1f0a0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1f0b0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1f0c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1f0d0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
1f0e0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1f0f0 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
1f100 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f110 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
1f120 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
1f130 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
1f140 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
1f150 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1f160 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
1f170 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
1f180 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
1f190 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
1f1a0 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
1f1b0 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
1f1c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f1d0 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
1f1e0 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
1f1f0 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
1f200 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f210 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
1f220 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
1f230 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
1f240 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1f250 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1f260 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1f270 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f280 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1f290 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1f2a0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1f2b0 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  oken[0]!=0 );.  
1f2c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f2d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69  ddOp2(v, OP_Vari
1f2e0 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
1f2f0 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
1f300 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1f310 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29  u.zToken[1]!=0 )
1f320 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1f330 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
1f340 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28  3VListNumToName(
1f350 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
1f360 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
1f370 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f380 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1f390 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63  [0]=='?' || strc
1f3a0 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
1f3b0 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20  en, z)==0 );.   
1f3c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c       pParse->pVL
1f3d0 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49  ist[0] = 0; /* I
1f3e0 6e 64 69 63 61 74 65 20 56 4c 69 73 74 20 6d 61  ndicate VList ma
1f3f0 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65  y no longer be e
1f400 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20 20 20  nlarged */.     
1f410 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
1f420 70 65 6e 64 50 34 28 76 2c 20 28 63 68 61 72 2a  pendP4(v, (char*
1f430 29 7a 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  )z, P4_STATIC);.
1f440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1f450 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1f460 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
1f470 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
1f480 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69   return pExpr->i
1f490 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66  Table;.    }.#if
1f4a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f4b0 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
1f4c0 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
1f4d0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
1f4e0 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
1f4f0 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
1f500 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65  n) */.      inRe
1f510 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1f520 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1f530 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f540 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
1f550 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
1f560 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f570 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f580 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
1f590 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f5a0 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
1f5b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1f5c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f5d0 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74  p2(v, OP_Cast, t
1f5e0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1f600 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
1f610 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
1f620 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74  en, 0));.      t
1f630 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
1f640 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
1f650 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
1f660 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f670 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1f680 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1f690 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20   inReg, 1);.    
1f6a0 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
1f6b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1f6c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1f6d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1f6e0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1f6f0 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20  ISNOT:.      op 
1f700 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
1f710 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
1f720 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45       p5 = SQLITE
1f730 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
1f740 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a  * fall-through *
1f750 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
1f760 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1f770 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1f780 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1f790 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1f7a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1f7b0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
1f7c0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
1f7d0 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Left;.      if( 
1f7e0 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
1f7f0 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20  tor(pLeft) ){.  
1f800 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72        codeVector
1f810 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1f820 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f  pExpr, target, o
1f830 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65  p, p5);.      }e
1f840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
1f850 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f860 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
1f870 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f880 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
1f890 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f8a0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f8b0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1f8c0 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  e2);.        cod
1f8d0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1f8e0 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70   pLeft, pExpr->p
1f8f0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1f900 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
1f910 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
1f920 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20  REP2 | p5);.    
1f930 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
1f940 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
1f950 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
1f960 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f970 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
1f980 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
1f990 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
1f9a0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
1f9b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f9c0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
1f9d0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
1f9e0 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
1f9f0 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
1fa00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1fa10 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
1fa20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
1fa30 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
1fa40 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
1fa50 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1fa60 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
1fa70 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1fa80 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1fa90 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1faa0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1fab0 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1fac0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
1fad0 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
1fae0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
1faf0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1fb00 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
1fb10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1fb20 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1fb30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1fb40 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1fb50 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1fb60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1fb70 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
1fb80 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
1fb90 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
1fba0 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
1fbb0 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
1fbc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
1fbd0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
1fbe0 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
1fbf0 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
1fc00 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
1fc10 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
1fc20 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
1fc30 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
1fc40 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
1fc50 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
1fc60 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20  =OP_And );      
1fc70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fc80 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20  op==TK_AND );.  
1fc90 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
1fca0 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20  R==OP_Or );     
1fcb0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1fcc0 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  e( op==TK_OR );.
1fcd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1fce0 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
1fcf0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1fd00 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53  ase( op==TK_PLUS
1fd10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1fd20 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
1fd30 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74  ubtract );     t
1fd40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fd50 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61  MINUS );.      a
1fd60 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
1fd70 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20  P_Remainder );  
1fd80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1fd90 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
1fda0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1fdb0 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
1fdc0 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1fdd0 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
1fde0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fdf0 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
1fe00 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73  Or );        tes
1fe10 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1fe20 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  TOR );.      ass
1fe30 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
1fe40 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20  P_Divide );     
1fe50 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fe60 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20  TK_SLASH );.    
1fe70 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
1fe80 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
1fe90 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  t );   testcase(
1fea0 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29   op==TK_LSHIFT )
1feb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fec0 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
1fed0 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73  iftRight );  tes
1fee0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53  tcase( op==TK_RS
1fef0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
1ff00 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
1ff10 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20  =OP_Concat );   
1ff20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ff30 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20  =TK_CONCAT );.  
1ff40 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1ff50 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1ff60 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1ff70 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1ff80 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1ff90 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1ffa0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1ffb0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1ffc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ffd0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
1ffe0 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1fff0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20000 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
20010 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20020 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
20030 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20040 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
20050 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
20060 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
20070 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
20080 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
20090 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
200a0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
200b0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
200c0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
200d0 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74  pLeft, 1, target
200e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
200f0 6e 20 74 61 72 67 65 74 3b 0a 23 69 66 6e 64 65  n target;.#ifnde
20100 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
20110 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
20120 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
20130 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
20140 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
20150 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
20160 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
20170 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
20180 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
20190 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pLeft->u.zToken,
201a0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
201b0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
201c0 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  et;.#endif.     
201d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
201e0 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e  tempX.op = TK_IN
201f0 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74  TEGER;.        t
20200 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f  empX.flags = EP_
20210 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65  IntValue|EP_Toke
20220 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74  nOnly;.        t
20230 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20  empX.u.iValue = 
20240 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  0;.        r1 = 
20250 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20260 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d  emp(pParse, &tem
20270 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pX, &regFree1);.
20280 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
20290 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
202a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
202b0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32  pLeft, &regFree2
202c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
202d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
202e0 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c  OP_Subtract, r2,
202f0 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
20300 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20310 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
20320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
20330 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20340 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
20350 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
20360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
20370 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
20380 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  Not );   testcas
20390 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54  e( op==TK_BITNOT
203a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
203b0 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
203c0 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74   );         test
203d0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
203e0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
203f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
20400 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
20410 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
20420 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
20430 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
20440 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
20450 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
20460 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
20470 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20480 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
20490 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
204a0 20 69 73 54 72 75 65 3b 20 20 20 20 2f 2a 20 49   isTrue;    /* I
204b0 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  S TRUE or IS NOT
204c0 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 69   TRUE */.      i
204d0 6e 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a  nt bNormal;   /*
204e0 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 46   IS TRUE or IS F
204f0 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 72 31  ALSE */.      r1
20500 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20510 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
20520 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
20530 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
20540 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20550 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73  1==0 );.      is
20560 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78  True = sqlite3Ex
20570 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78  prTruthValue(pEx
20580 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
20590 20 20 20 62 4e 6f 72 6d 61 6c 20 3d 20 70 45 78     bNormal = pEx
205a0 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 3b 0a  pr->op2==TK_IS;.
205b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
205c0 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61  isTrue && bNorma
205d0 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
205e0 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20 62  se( !isTrue && b
205f0 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 73  Normal);.      s
20600 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20610 49 6e 74 28 76 2c 20 4f 50 5f 49 73 54 72 75 65  Int(v, OP_IsTrue
20620 2c 20 72 31 2c 20 69 6e 52 65 67 2c 20 21 69 73  , r1, inReg, !is
20630 54 72 75 65 2c 20 69 73 54 72 75 65 20 5e 20 62  True, isTrue ^ b
20640 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 62  Normal);.      b
20650 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
20660 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
20670 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
20680 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
20690 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73   addr;.      ass
206a0 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
206b0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
206c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
206d0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
206e0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
206f0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
20700 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
20710 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
20720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20730 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
20740 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
20750 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
20760 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
20770 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20780 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
20790 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
207a0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
207b0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
207c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
207d0 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
207e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
207f0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
20800 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
20810 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
20820 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
20830 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20840 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
20850 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  er, 0, target);.
20860 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20870 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
20880 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
20890 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
208a0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
208b0 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
208c0 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d   *pInfo = pExpr-
208d0 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
208e0 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
208f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20900 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
20910 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
20920 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
20930 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20940 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
20950 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
20960 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  s()", pExpr->u.z
20970 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
20980 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
20990 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  urn pInfo->aFunc
209a0 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
209b0 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
209c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
209d0 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
209e0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
209f0 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
20a00 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
20a10 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
20a20 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
20a30 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  Farg;           
20a40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
20a50 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
20a60 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  s */.      FuncD
20a70 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20  ef *pDef;       
20a80 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
20a90 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a  n definition obj
20aa0 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ect */.      con
20ab0 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
20ac0 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
20ad0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
20ae0 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20    u32 constMask 
20af0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b  = 0;     /* Mask
20b00 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
20b10 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  uments that are 
20b20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20  constant */.    
20b30 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
20b40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
20b50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
20b60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20b70 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
20b80 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
20b90 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  nection */.     
20ba0 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
20bb0 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  );      /* The t
20bc0 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65  ext encoding use
20bd0 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  d by this databa
20be0 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c  se */.      Coll
20bf0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20  Seq *pColl = 0; 
20c00 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e     /* A collatin
20c10 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 23  g sequence */..#
20c20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20c30 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
20c40 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
20c50 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
20c60 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
20c70 52 65 64 75 63 65 64 29 20 26 26 20 70 45 78 70  Reduced) && pExp
20c80 72 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20 20  r->pWin ){.     
20c90 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
20ca0 3e 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74  >pWin->regResult
20cb0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
20cc0 0a 0a 20 20 20 20 20 20 69 66 28 20 43 6f 6e 73  ..      if( Cons
20cd0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
20ce0 29 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  ) && sqlite3Expr
20cf0 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
20d00 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
20d10 20 20 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74      /* SQL funct
20d20 69 6f 6e 73 20 63 61 6e 20 62 65 20 65 78 70 65  ions can be expe
20d30 6e 73 69 76 65 2e 20 53 6f 20 74 72 79 20 74 6f  nsive. So try to
20d40 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e 74 20 66   move constant f
20d50 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 20  unctions.       
20d60 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 69   ** out of the i
20d70 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76 65 6e 20  nner loop, even 
20d80 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 61 6e  if that means an
20d90 20 65 78 74 72 61 20 4f 50 5f 43 6f 70 79 2e 20   extra OP_Copy. 
20da0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
20db0 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
20dc0 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
20dd0 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 20 20  pExpr, -1);.    
20de0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
20df0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
20e00 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
20e10 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
20e20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
20e30 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
20e40 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
20e50 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
20e60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20e70 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
20e80 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
20e90 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67     }.      nFarg
20ea0 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67   = pFarg ? pFarg
20eb0 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
20ec0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
20ed0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
20ee0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
20ef0 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70  );.      zId = p
20f00 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
20f10 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
20f20 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
20f30 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c  (db, zId, nFarg,
20f40 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65 66   enc, 0);.#ifdef
20f50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
20f60 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54  NKNOWN_SQL_FUNCT
20f70 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70 44  ION.      if( pD
20f80 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  ef==0 && pParse-
20f90 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
20fa0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
20fb0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
20fc0 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46  b, "unknown", nF
20fd0 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  arg, enc, 0);.  
20fe0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20ff0 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c     if( pDef==0 |
21000 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a  | pDef->xFinaliz
21010 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
21020 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21030 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
21040 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22   function: %s()"
21050 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
21060 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
21070 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
21080 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d   a direct implem
21090 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
210a0 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43  built-in COALESC
210b0 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  E() and.      **
210c0 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69   IFNULL() functi
210d0 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ons.  This avoid
210e0 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76  s unnecessary ev
210f0 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20  aluation of.    
21100 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70    ** arguments p
21110 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f  ast the first no
21120 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  n-NULL argument.
21130 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21140 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
21150 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21160 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
21170 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
21180 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
21190 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
211a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
211b0 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
211c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
211d0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
211e0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
211f0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
21200 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
21210 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
21220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21230 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
21240 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
21250 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
21260 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
21270 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
21280 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
21290 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61  emove(pParse, ta
212a0 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rget, 1);.      
212b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
212c0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
212d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
212e0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
212f0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
21300 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
21310 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21320 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
21330 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  arse);.        }
21340 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21350 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
21360 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  (v, endCoalesce)
21370 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
21380 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21390 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28  /* The UNLIKELY(
213a0 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  ) function is a 
213b0 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75  no-op.  The resu
213c0 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a  lt is the value.
213d0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
213e0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
213f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
21400 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
21410 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
21420 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20  _UNLIKELY ){.   
21430 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
21440 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg>=1 );.       
21450 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
21460 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
21470 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
21480 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
21490 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65  ;.      }..#ifde
214a0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
214b0 20 20 20 20 20 2f 2a 20 54 68 65 20 41 46 46 49       /* The AFFI
214c0 4e 49 54 59 28 29 20 66 75 6e 63 74 69 6f 6e 20  NITY() function 
214d0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20 73  evaluates to a s
214e0 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
214f0 69 62 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ibes.      ** th
21500 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  e type affinity 
21510 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  of the argument.
21520 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
21530 6f 72 20 74 65 73 74 69 6e 67 20 6f 66 0a 20 20  or testing of.  
21540 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74      ** the SQLit
21550 65 20 74 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20  e type logic..  
21560 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
21570 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
21580 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41   & SQLITE_FUNC_A
21590 46 46 49 4e 49 54 59 20 29 7b 0a 20 20 20 20 20  FFINITY ){.     
215a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
215b0 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62  zAff[] = { "blob
215c0 22 2c 20 22 74 65 78 74 22 2c 20 22 6e 75 6d 65  ", "text", "nume
215d0 72 69 63 22 2c 20 22 69 6e 74 65 67 65 72 22 2c  ric", "integer",
215e0 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20   "real" };.     
215f0 20 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 20     char aff;.   
21600 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
21610 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg==1 );.       
21620 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78   aff = sqlite3Ex
21630 70 72 41 66 66 69 6e 69 74 79 28 70 46 61 72 67  prAffinity(pFarg
21640 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
21650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21660 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
21670 74 61 72 67 65 74 2c 20 0a 20 20 20 20 20 20 20  target, .       
21680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21690 20 20 20 20 20 20 20 61 66 66 20 3f 20 61 7a 41         aff ? azA
216a0 66 66 5b 61 66 66 2d 53 51 4c 49 54 45 5f 41 46  ff[aff-SQLITE_AF
216b0 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22  F_BLOB] : "none"
216c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
216d0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
216e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
216f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67  for(i=0; i<nFarg
21700 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
21710 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69  if( i<32 && sqli
21720 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
21730 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  t(pFarg->a[i].pE
21740 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
21750 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33    testcase( i==3
21760 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
21770 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  onstMask |= MASK
21780 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20  BIT32(i);.      
21790 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
217a0 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
217b0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
217c0 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21  EEDCOLL)!=0 && !
217d0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
217e0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
217f0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
21800 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
21810 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
21820 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21830 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20    if( pFarg ){. 
21840 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74         if( const
21850 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  Mask ){.        
21860 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e    r1 = pParse->n
21870 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  Mem+1;.         
21880 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
21890 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20   nFarg;.        
218a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
218b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
218c0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
218d0 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
218e0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
218f0 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64  For length() and
21900 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69   typeof() functi
21910 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d  ons with a colum
21920 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20  n argument,.    
21930 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50      ** set the P
21940 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  5 parameter to t
21950 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
21960 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45  ode to OPFLAG_LE
21970 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20  NGTHARG.        
21980 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50  ** or OPFLAG_TYP
21990 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76  EOFARG respectiv
219a0 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e  ely, to avoid un
219b0 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20  necessary data. 
219c0 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e         ** loadin
219d0 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  g..        */.  
219e0 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
219f0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51  >funcFlags & (SQ
21a00 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
21a10 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50  |SQLITE_FUNC_TYP
21a20 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  EOF))!=0 ){.    
21a30 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b        u8 exprOp;
21a40 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
21a50 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20  t( nFarg==1 );. 
21a60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21a70 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21a80 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
21a90 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72     exprOp = pFar
21aa0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
21ab0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  p;.          if(
21ac0 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55   exprOp==TK_COLU
21ad0 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b  MN || exprOp==TK
21ae0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  _AGG_COLUMN ){. 
21af0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
21b00 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  t( SQLITE_FUNC_L
21b10 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45  ENGTH==OPFLAG_LE
21b20 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
21b30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
21b40 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f  QLITE_FUNC_TYPEO
21b50 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  F==OPFLAG_TYPEOF
21b60 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
21b70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
21b80 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f  f->funcFlags & O
21b90 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
21ba0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
21bb0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
21bc0 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20  ->op2 = .       
21bd0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d             pDef-
21be0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50  >funcFlags & (OP
21bf0 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f  FLAG_LENGTHARG|O
21c00 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29  PFLAG_TYPEOFARG)
21c10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21c20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
21c30 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
21c40 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20  ePush(pParse);  
21c50 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
21c60 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
21c70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21c80 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
21c90 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20  rse, pFarg, r1, 
21ca0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
21cd0 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  UP|SQLITE_ECEL_F
21ce0 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20 20  ACTOR);.        
21cf0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
21d00 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20 20  Pop(pParse);    
21d10 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
21d20 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
21d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21d40 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   r1 = 0;.      }
21d50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21d60 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
21d70 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69  E.      /* Possi
21d80 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65  bly overload the
21d90 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65   function if the
21da0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
21db0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69  is.      ** a vi
21dc0 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75  rtual table colu
21dd0 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  mn..      **.   
21de0 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20     ** For infix 
21df0 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c  functions (LIKE,
21e00 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61   GLOB, REGEXP, a
21e10 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68  nd MATCH) use th
21e20 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  e.      ** secon
21e30 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20  d argument, not 
21e40 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68  the first, as th
21e50 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65  e argument to te
21e60 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  st to.      ** s
21e70 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f  ee if it is a co
21e80 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61  lumn in a virtua
21e90 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  l table.  This i
21ea0 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20  s done because. 
21eb0 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74       ** the left
21ec0 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69   operand of infi
21ed0 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65  x functions (the
21ee0 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74   operand we want
21ef0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   to.      ** con
21f00 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67  trol overloading
21f10 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65  ) ends up as the
21f20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
21f30 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
21f40 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
21f50 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c  expression "A gl
21f60 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c  ob B" is equival
21f70 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
21f80 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65   "glob(B,A).  We
21f90 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65   want to use the
21fa0 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22   A in "A glob B"
21fb0 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a   to test.      *
21fc0 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f  * for function o
21fd0 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74  verloading.  But
21fe0 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65   we use the B te
21ff0 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29  rm in "glob(B,A)
22000 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
22010 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26    if( nFarg>=2 &
22020 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  & (pExpr->flags 
22030 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20  & EP_InfixFunc) 
22040 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
22050 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
22060 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
22070 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
22080 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  Farg->a[1].pExpr
22090 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
220a0 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20  f( nFarg>0 ){.  
220b0 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
220c0 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
220d0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
220e0 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
220f0 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
22100 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22110 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
22120 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
22130 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
22140 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
22150 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
22160 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20  ->pDfltColl; .  
22170 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22180 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
22190 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20  llSeq, 0, 0, 0, 
221a0 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
221b0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
221c0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
221d0 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f  E_ENABLE_OFFSET_
221e0 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20 69  SQL_FUNC.      i
221f0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
22200 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
22210 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20 20 20 20  _OFFSET ){.     
22220 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20     Expr *pArg = 
22230 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
22240 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  r;.        if( p
22250 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  Arg->op==TK_COLU
22260 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
22270 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22280 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c 20  3(v, OP_Offset, 
22290 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70 41  pArg->iTable, pA
222a0 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72  rg->iColumn, tar
222b0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  get);.        }e
222c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
222d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
222e0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
222f0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
22300 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23   }.      }else.#
22310 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
22320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22330 65 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72 73  eAddOp4(v, pPars
22340 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f 50  e->iSelfTab ? OP
22350 5f 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50 5f  _PureFunc0 : OP_
22360 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20 20  Function0,.     
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22380 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20       constMask, 
22390 72 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68 61  r1, target, (cha
223a0 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43  r*)pDef, P4_FUNC
223b0 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71  DEF);.        sq
223c0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
223d0 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b  5(v, (u8)nFarg);
223e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
223f0 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73  f( nFarg && cons
22400 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  tMask==0 ){.    
22410 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
22420 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
22430 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a  se, r1, nFarg);.
22440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
22450 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
22460 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
22470 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
22480 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
22490 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
224a0 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
224b0 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
224c0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
224d0 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
224e0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
224f0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
22500 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
22510 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70  ECT && (nCol = p
22520 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
22530 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21  >pEList->nExpr)!
22540 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
22550 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
22560 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  ror(pParse, nCol
22570 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
22580 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
22590 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  n sqlite3CodeSub
225a0 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
225b0 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Expr, 0, 0);.   
225c0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
225d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
225e0 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
225f0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  N: {.      int n
22600 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
22610 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65  r->pLeft->iTable
22620 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
22630 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61  Expr->pLeft->iTa
22640 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ble = sqlite3Cod
22650 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
22660 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
22670 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
22680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
22690 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
226a0 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  | pExpr->pLeft->
226b0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
226c0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
226d0 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
226e0 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
226f0 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  !=(n = sqlite3Ex
22700 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
22710 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20  pr->pLeft)) .   
22720 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
22730 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
22740 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e  arse, "%d column
22750 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61  s assigned %d va
22760 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lues",.         
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22780 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
22790 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  able, n);.      
227a0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
227b0 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61  Expr->pLeft->iTa
227c0 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f  ble + pExpr->iCo
227d0 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lumn;.    }.    
227e0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
227f0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
22800 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
22810 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22820 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
22830 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
22840 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22850 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22860 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
22870 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
22880 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22890 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
228a0 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
228b0 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
228c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
228d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
228e0 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
228f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22900 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
22910 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
22920 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22930 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22940 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
22950 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
22960 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
22970 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
22980 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
22990 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
229a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
229b0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
229c0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
229d0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
229e0 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  D z.    **.    *
229f0 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  * This is equiva
22a00 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20  lent to.    **. 
22a10 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
22a20 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20  D x<=z.    **.  
22a30 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64    ** X is stored
22a40 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
22a50 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74  ..    ** Y is st
22a60 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
22a70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
22a80 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74  ..    ** Z is st
22a90 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
22aa0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
22ab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
22ac0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
22ad0 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
22ae0 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
22af0 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  xpr, target, 0, 
22b00 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
22b10 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
22b20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a     case TK_SPAN:
22b30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
22b40 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20  LATE: .    case 
22b50 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
22b60 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d    pExpr = pExpr-
22b70 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67 6f  >pLeft;.      go
22b80 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f  to expr_code_doo
22b90 76 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34 2d  ver; /* 2018-04-
22ba0 32 38 3a 20 50 72 65 76 65 6e 74 20 64 65 65 70  28: Prevent deep
22bb0 20 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53 46   recursion. OSSF
22bc0 75 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20  uzz. */.    }.. 
22bd0 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47     case TK_TRIGG
22be0 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ER: {.      /* I
22bf0 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  f the opcode is 
22c00 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e  TK_TRIGGER, then
22c10 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22c20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20  is a reference. 
22c30 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c       ** to a col
22c40 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
22c50 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f   or old.* pseudo
22c60 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c  -tables availabl
22c70 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72  e to.      ** tr
22c80 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20  igger programs. 
22c90 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70  In this case Exp
22ca0 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  r.iTable is set 
22cb0 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20  to 1 for the.   
22cc0 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75     ** new.* pseu
22cd0 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66  do-table, or 0 f
22ce0 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  or the old.* pse
22cf0 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e  udo-table. Expr.
22d00 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a  iColumn.      **
22d10 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
22d20 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65  olumn of the pse
22d30 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61  udo-table to rea
22d40 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20  d, or to -1 to. 
22d50 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65       ** read the
22d60 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20   rowid field..  
22d70 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
22d80 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
22d90 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
22da0 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20  ing an OP_Param 
22db0 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20  opcode. The p1. 
22dc0 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
22dd0 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f  r is set to 0 fo
22de0 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72  r an old.rowid r
22df0 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20  eference, or to 
22e00 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74  (i+1).      ** t
22e10 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74  o reference anot
22e20 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  her column of th
22e30 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
22e40 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20  able, where .   
22e50 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69     ** i is the i
22e60 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
22e70 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f  mn. For a new.ro
22e80 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70  wid reference, p
22e90 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65  1 is.      ** se
22ea0 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72  t to (n+1), wher
22eb0 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e n is the numbe
22ec0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
22ed0 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c  each pseudo-tabl
22ee0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  e..      ** For 
22ef0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
22f00 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20  ny other column 
22f10 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65  in the new.* pse
22f20 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20  udo-table, p1.  
22f30 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
22f40 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20   (n+2+i), where 
22f50 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64  n and i are as d
22f60 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c  efined previousl
22f70 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20  y. For.      ** 
22f80 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
22f90 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74  table on which t
22fa0 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e  riggers are bein
22fb0 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20  g fired is.     
22fc0 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a   ** declared as:
22fd0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22fe0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
22ff0 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
23000 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
23010 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72  en p1 is interpr
23020 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
23030 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
23040 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20  **   p1==0   -> 
23050 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20     old.rowid    
23060 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e   p1==3   ->    n
23070 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a  ew.rowid.      *
23080 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20  *   p1==1   ->  
23090 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20    old.a         
230a0 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65  p1==4   ->    ne
230b0 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  w.a.      **   p
230c0 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==2   ->    old
230d0 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35  .b         p1==5
230e0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20     ->    new.b  
230f0 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20       .      */. 
23100 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
23110 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
23120 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70        int p1 = p
23130 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28  Expr->iTable * (
23140 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20  pTab->nCol+1) + 
23150 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  1 + pExpr->iColu
23160 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  mn;..      asser
23170 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
23180 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  ==0 || pExpr->iT
23190 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
231a0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
231b0 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70  iColumn>=-1 && p
231c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54  Expr->iColumn<pT
231d0 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
231e0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
231f0 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72  iPKey<0 || pExpr
23200 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d  ->iColumn!=pTab-
23210 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  >iPKey );.      
23220 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26  assert( p1>=0 &&
23230 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a   p1<(pTab->nCol*
23240 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73  2+2) );..      s
23250 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23260 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31  (v, OP_Param, p1
23270 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
23280 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
23290 20 22 72 5b 25 64 5d 3d 25 73 2e 25 73 22 2c 20   "r[%d]=%s.%s", 
232a0 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
232b0 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f  (pExpr->iTable ?
232c0 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c   "new" : "old"),
232d0 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
232e0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f  >iColumn<0 ? "ro
232f0 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54  wid" : pExpr->pT
23300 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
23310 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a  iColumn].zName).
23320 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64        ));..#ifnd
23330 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
23340 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
23350 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
23360 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66  lumn has REAL af
23370 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63  finity, it may c
23380 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
23390 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a  ed as an.      *
233a0 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f  * integer. Use O
233b0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74  P_RealAffinity t
233c0 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
233d0 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20  s really real.. 
233e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
233f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
23400 36 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69  60985-57662 SQLi
23410 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20  te will convert 
23420 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74  the value back t
23430 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74  o.      ** float
23440 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65  ing point when e
23450 78 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f  xtracting it fro
23460 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a  m the record.  *
23470 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  /.      if( pExp
23480 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20  r->iColumn>=0 . 
23490 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61        && pTab->a
234a0 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
234b0 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  mn].affinity==SQ
234c0 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
234d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
234e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
234f0 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
23500 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ity, target);.  
23510 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
23520 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
23530 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43  .    case TK_VEC
23540 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TOR: {.      sql
23550 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23560 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
23570 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20  misused");.     
23580 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
23590 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
235a0 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20  LL_ROW: {.      
235b0 69 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20  int addrINR;.   
235c0 20 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c     addrINR = sql
235d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
235e0 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20  , OP_IfNullRow, 
235f0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
23600 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23610 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
23620 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  e);.      inReg 
23630 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
23640 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
23650 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
23660 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
23670 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
23680 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
23690 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
236a0 65 72 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b  ere(v, addrINR);
236b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
236c0 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
236d0 64 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20  drINR, inReg);. 
236e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
236f0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
23700 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
23710 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
23720 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
23730 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
23740 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
23750 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
23760 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
23770 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
23780 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
23790 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
237a0 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
237b0 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
237c0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
237d0 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
237e0 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
237f0 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
23800 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
23810 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
23820 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
23830 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
23840 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
23850 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
23860 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
23870 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
23880 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
23890 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
238a0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
238b0 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
238c0 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   of pExpr->x.pLi
238d0 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70  st if pExpr->x.p
238e0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20  List->nExpr is. 
238f0 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20     ** odd.  The 
23900 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
23910 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62  al.  If the numb
23920 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
23930 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a  n x.pList.    **
23940 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59   is even, then Y
23950 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
23960 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20  the "otherwise" 
23970 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
23980 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20      ** Ei is in 
23990 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
239a0 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70  i*2] and Ri is p
239b0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
239c0 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20  *2+1]..    **.  
239d0 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
239e0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
239f0 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20  n is the Ri for 
23a00 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
23a10 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72  ng Ei,.    ** or
23a20 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
23a30 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65  matching Ei, the
23a40 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72   ELSE term Y, or
23a50 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   if there is.   
23a60 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d   ** no ELSE term
23a70 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  , NULL..    */. 
23a80 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
23a90 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  rt( op==TK_CASE 
23aa0 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ); {.      int e
23ab0 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ad0 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
23ae0 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
23af0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
23b00 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
23b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
23b20 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
23b30 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
23b40 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
23b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23b60 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
23b70 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
23b80 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
23b90 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23bb0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
23bc0 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
23bd0 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
23be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
23bf0 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
23c00 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
23c10 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
23c20 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
23c30 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
23c40 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
23c50 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
23c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c70 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
23c80 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
23c90 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cb0 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73  /* The X express
23cc0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
23cd0 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20  r *pTest = 0;   
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23cf0 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29  * X==Ei (form A)
23d00 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72   or just Ei (for
23d10 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56  m B) */.      VV
23d20 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63  A_ONLY( int iCac
23d30 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  heLevel = pParse
23d40 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29  ->iCacheLevel; )
23d50 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
23d60 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
23d70 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
23d80 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
23d90 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
23da0 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
23db0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
23dc0 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
23dd0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
23de0 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
23df0 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
23e00 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
23e10 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
23e20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
23e30 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
23e40 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
23e50 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
23e60 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
23e70 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a     tempX = *pX;.
23e80 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
23e90 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
23ea0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65  UMN );.        e
23eb0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74  xprToRegister(&t
23ec0 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65  empX, exprCodeVe
23ed0 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65  ctor(pParse, &te
23ee0 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  mpX, &regFree1))
23ef0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
23f00 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
23f10 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
23f20 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c  t(&opCompare, 0,
23f30 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72   sizeof(opCompar
23f40 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  e));.        opC
23f50 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
23f60 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
23f70 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65  pare.pLeft = &te
23f80 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  mpX;.        pTe
23f90 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
23fa0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  .        /* Tick
23fb0 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65  et b351d95f9cd5e
23fc0 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63  f17e9d9dbae18f5c
23fd0 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20  a8611190001:.   
23fe0 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
23ff0 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69  e in regFree1 mi
24000 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64  ght get SCopy-ed
24010 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72   into the file r
24020 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
24030 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * So make sure t
24040 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31  hat the regFree1
24050 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
24060 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65   reused for othe
24070 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72  r.        ** pur
24080 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62  poses and possib
24090 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ly overwritten. 
240a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46   */.        regF
240b0 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ree1 = 0;.      
240c0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
240d0 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b   i<nExpr-1; i=i+
240e0 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2){.        sqli
240f0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
24100 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
24110 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20    if( pX ){.    
24120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
24130 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  est!=0 );.      
24140 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52      opCompare.pR
24150 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  ight = aListelem
24160 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
24170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24180 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73      pTest = aLis
24190 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
241a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
241b0 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c    nextCase = sql
241c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
241d0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  l(v);.        te
241e0 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f  stcase( pTest->o
241f0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
24200 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
24210 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
24220 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
24230 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
24240 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
24250 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
24260 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
24270 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
24280 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24290 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
242a0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
242b0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
242c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
242d0 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61  dbeGoto(v, endLa
242e0 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
242f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
24300 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
24310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
24320 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65  solveLabel(v, ne
24330 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  xtCase);.      }
24340 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70  .      if( (nExp
24350 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  r&1)!=0 ){.     
24360 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
24370 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
24380 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24390 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
243a0 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72   pEList->a[nExpr
243b0 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  -1].pExpr, targe
243c0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
243d0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
243e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
243f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
24400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24410 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
24420 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
24430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
24440 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
24450 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
24460 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20  ->nErr>0 .      
24470 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
24480 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61  iCacheLevel==iCa
24490 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20  cheLevel );.    
244a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
244b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
244c0 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  Label);.      br
244d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
244e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
244f0 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
24500 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
24510 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
24520 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
24530 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20  llback .        
24540 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
24550 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a  inity==OE_Abort.
24560 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
24570 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
24580 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20  E_Fail.         
24590 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
245a0 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a  nity==OE_Ignore.
245b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
245c0 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69  f( !pParse->pTri
245d0 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20  ggerTab ){.     
245e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
245f0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24610 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
24620 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
24630 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
24640 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
24650 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
24660 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
24670 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
24680 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
24690 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
246a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
246b0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
246c0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
246d0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
246e0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66  lue) );.      if
246f0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
24700 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  y==OE_Ignore ){.
24710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24720 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
24730 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c         v, OP_Hal
24740 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45  t, SQLITE_OK, OE
24750 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70  _Ignore, 0, pExp
24760 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a  r->u.zToken,0);.
24770 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
24780 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
24790 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
247a0 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
247b0 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49  int(pParse, SQLI
247c0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
247d0 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20  IGGER,.         
247e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247f0 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
24800 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  nity, pExpr->u.z
24810 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  Token, 0, 0);.  
24820 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65      }..      bre
24830 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
24840 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
24850 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
24860 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
24870 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
24880 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
24890 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74  regFree2);.  ret
248a0 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
248b0 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74  .** Factor out t
248c0 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67  he code of the g
248d0 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
248e0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
248f0 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n time..**.** If
24900 20 72 65 67 44 65 73 74 3e 3d 30 20 74 68 65 6e   regDest>=0 then
24910 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
24920 6c 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20  lways stored in 
24930 74 68 61 74 20 72 65 67 69 73 74 65 72 20 61 6e  that register an
24940 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  d the.** result 
24950 69 73 20 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e  is not reusable.
24960 20 20 49 66 20 72 65 67 44 65 73 74 3c 30 20 74    If regDest<0 t
24970 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
24980 20 69 73 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20   is free to .** 
24990 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
249a0 77 68 65 72 65 65 76 65 72 20 69 74 20 77 61 6e  whereever it wan
249b0 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 65  ts.  The registe
249c0 72 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72  r where the expr
249d0 65 73 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74  ession .** is st
249e0 6f 72 65 64 20 69 73 20 72 65 74 75 72 6e 65 64  ored is returned
249f0 2e 20 20 57 68 65 6e 20 72 65 67 44 65 73 74 3c  .  When regDest<
24a00 30 2c 20 74 77 6f 20 69 64 65 6e 74 69 63 61 6c  0, two identical
24a10 20 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69 6c   expressions wil
24a20 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68 65  l.** code to the
24a30 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 0a   same register..
24a40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
24a50 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20  prCodeAtInit(.  
24a60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
24a70 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
24a80 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
24a90 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
24aa0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
24ab0 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56   code when the V
24ac0 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  DBE initializes 
24ad0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74  */.  int regDest
24ae0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
24af0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69  the value in thi
24b00 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
24b10 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a  .  ExprList *p;.
24b20 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46    assert( ConstF
24b30 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
24b40 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
24b50 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69  >pConstExpr;.  i
24b60 66 28 20 72 65 67 44 65 73 74 3c 30 20 26 26 20  f( regDest<0 && 
24b70 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  p ){.    struct 
24b80 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
24b90 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Item;.    int i;
24ba0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
24bb0 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b  ->a, i=p->nExpr;
24bc0 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69   i>0; pItem++, i
24bd0 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  --){.      if( p
24be0 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26  Item->reusable &
24bf0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
24c00 70 61 72 65 28 30 2c 70 49 74 65 6d 2d 3e 70 45  pare(0,pItem->pE
24c10 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30  xpr,pExpr,-1)==0
24c20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
24c30 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e  rn pItem->u.iCon
24c40 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20  stExprReg;.     
24c50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
24c60 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
24c70 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
24c80 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70  , pExpr, 0);.  p
24c90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
24ca0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
24cb0 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66   p, pExpr);.  if
24cc0 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75  ( p ){.     stru
24cd0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
24ce0 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
24cf0 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  p->nExpr-1];.   
24d00 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c    pItem->reusabl
24d10 65 20 3d 20 72 65 67 44 65 73 74 3c 30 3b 0a 20  e = regDest<0;. 
24d20 20 20 20 20 69 66 28 20 72 65 67 44 65 73 74 3c      if( regDest<
24d30 30 20 29 20 72 65 67 44 65 73 74 20 3d 20 2b 2b  0 ) regDest = ++
24d40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
24d50 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e     pItem->u.iCon
24d60 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44  stExprReg = regD
24d70 65 73 74 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  est;.  }.  pPars
24d80 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20  e->pConstExpr = 
24d90 70 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 44  p;.  return regD
24da0 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  est;.}../*.** Ge
24db0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
24dc0 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
24dd0 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ssion and store 
24de0 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
24df0 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
24e00 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
24e10 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72  ster number wher
24e20 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
24e30 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
24e40 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74  ** If the regist
24e50 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
24e60 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  y register that 
24e70 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74  can be deallocat
24e80 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  ed,.** then writ
24e90 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74  e its number int
24ea0 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65  o *pReg.  If the
24eb0 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
24ec0 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d   is not.** a tem
24ed0 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74  porary, then set
24ee0 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a   *pReg to zero..
24ef0 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
24f00 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68  s a constant, th
24f10 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
24f20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74  might generate t
24f30 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66  his.** code to f
24f40 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72  ill the register
24f50 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69   in the initiali
24f60 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f  zation section o
24f70 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72  f the.** VDBE pr
24f80 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20  ogram, in order 
24f90 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74  to factor it out
24fa0 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69   of the evaluati
24fb0 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  on loop..*/.int 
24fc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
24fd0 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  emp(Parse *pPars
24fe0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
24ff0 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e  int *pReg){.  in
25000 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20  t r2;.  pExpr = 
25010 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
25020 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20  ollate(pExpr);. 
25030 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
25040 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26  Ok(pParse).   &&
25050 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
25060 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71  EGISTER.   && sq
25070 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
25080 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
25090 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 52 65 67  ).  ){.    *pReg
250a0 20 20 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d 20    = 0;.    r2 = 
250b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
250c0 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
250d0 78 70 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73  xpr, -1);.  }els
250e0 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20  e{.    int r1 = 
250f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
25100 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
25110 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
25120 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
25130 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
25140 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
25150 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31        *pReg = r1
25160 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25170 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
25180 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
25190 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65   r1);.      *pRe
251a0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
251b0 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a  .  return r2;.}.
251c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
251d0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
251e0 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
251f0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
25200 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
25210 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
25220 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
25230 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
25240 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
25250 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
25260 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
25270 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
25280 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
25290 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
252a0 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  t){.  int inReg;
252b0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
252c0 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
252d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
252e0 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
252f0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
25300 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c  ISTER ){.    sql
25310 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
25320 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
25330 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54  _Copy, pExpr->iT
25340 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
25350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65   }else{.    inRe
25360 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
25370 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
25380 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
25390 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
253a0 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c  arse->pVdbe!=0 |
253b0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
253c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
253d0 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
253e0 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
253f0 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Vdbe ){.      sq
25400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25410 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
25420 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
25430 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20  target);.    }. 
25440 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
25450 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70   a transient cop
25460 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
25470 70 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63  pExpr and then c
25480 6f 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20  ode it using.** 
25490 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
254a0 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
254b0 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
254c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
254d0 28 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61  ().** except tha
254e0 74 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72  t the input expr
254f0 65 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e  ession is guaran
25500 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61  teed to be uncha
25510 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
25520 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
25530 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
25540 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
25550 74 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c  t target){.  sql
25560 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
25570 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d  e->db;.  pExpr =
25580 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
25590 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
255a0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
255b0 46 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33  Failed ) sqlite3
255c0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
255d0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
255e0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
255f0 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
25600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
25610 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
25620 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
25630 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
25640 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
25650 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
25660 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
25670 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
25680 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
25690 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
256a0 72 67 65 74 2e 20 20 49 66 20 74 68 65 20 65 78  rget.  If the ex
256b0 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
256c0 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  tant, then this 
256d0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74  routine.** might
256e0 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20   choose to code 
256f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
25700 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  t initialization
25710 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   time..*/.void s
25720 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61  qlite3ExprCodeFa
25730 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a  ctorable(Parse *
25740 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
25750 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
25760 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
25770 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26  okConstFactor &&
25780 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
25790 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b  nstant(pExpr) ){
257a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
257b0 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
257c0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
257d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
257e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
257f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
25800 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  arget);.  }.}../
25810 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
25820 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74 65  de that evaluate
25830 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
25840 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
25850 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
25860 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
25870 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
25880 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
25890 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
258a0 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
258b0 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
258c0 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
258d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
258e0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
258f0 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
25900 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
25910 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
25920 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
25930 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
25940 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
25950 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
25960 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
25970 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
25980 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
25990 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
259a0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
259b0 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
259c0 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f  re reused..*/.vo
259d0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
259e0 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
259f0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
25a00 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
25a10 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
25a20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
25a30 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73   int iMem;..  as
25a40 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
25a50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
25a60 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
25a70 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ER );.  sqlite3E
25a80 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
25a90 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
25aa0 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
25ab0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
25ac0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25ad0 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c  OP_Copy, target,
25ae0 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f   iMem);.  exprTo
25af0 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20  Register(pExpr, 
25b00 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iMem);.}../*.** 
25b10 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
25b20 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
25b30 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
25b40 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
25b50 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
25b60 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
25b70 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
25b80 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
25b90 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
25ba0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
25bb0 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
25bc0 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65  ated.  The numbe
25bd0 72 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 0a  r returned will.
25be0 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65 20 70 4c  ** usually be pL
25bf0 69 73 74 2d 3e 6e 45 78 70 72 20 62 75 74 20 6d  ist->nExpr but m
25c00 69 67 68 74 20 62 65 20 72 65 64 75 63 65 64 20  ight be reduced 
25c10 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f  if SQLITE_ECEL_O
25c20 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20 64 65 66  MITREF.** is def
25c30 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ined..**.** The 
25c40 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20  SQLITE_ECEL_DUP 
25c50 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68  flag prevents th
25c60 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  e arguments from
25c70 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64   being.** filled
25c80 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e   using OP_SCopy.
25c90 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62    OP_Copy must b
25ca0 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  e used instead..
25cb0 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
25cc0 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67  _ECEL_FACTOR arg
25cd0 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e  ument allows con
25ce0 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  stant arguments 
25cf0 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65  to be.** factore
25d00 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69  d out into initi
25d10 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  alization code..
25d20 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
25d30 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d  _ECEL_REF flag m
25d40 65 61 6e 73 20 74 68 61 74 20 65 78 70 72 65 73  eans that expres
25d50 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73  sions in the lis
25d60 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69  t with.** ExprLi
25d70 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65  st.a[].u.x.iOrde
25d80 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c  rByCol>0 have al
25d90 72 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75  ready been evalu
25da0 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a  ated and stored.
25db0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  ** in registers 
25dc0 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73  at srcReg, and s
25dd0 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20  o the value can 
25de0 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  be copied from t
25df0 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51 4c 49  here..** If SQLI
25e00 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20  TE_ECEL_OMITREF 
25e10 69 73 20 61 6c 73 6f 20 73 65 74 2c 20 74 68 65  is also set, the
25e20 6e 20 74 68 65 20 76 61 6c 75 65 73 20 77 69 74  n the values wit
25e30 68 20 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  h u.x.iOrderByCo
25e40 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d 70 6c  l>0.** are simpl
25e50 79 20 6f 6d 69 74 74 65 64 20 72 61 74 68 65 72  y omitted rather
25e60 20 74 68 61 6e 20 62 65 69 6e 67 20 63 6f 70 69   than being copi
25e70 65 64 20 66 72 6f 6d 20 73 72 63 52 65 67 2e 0a  ed from srcReg..
25e80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
25e90 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
25ea0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25eb0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
25ec0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
25ed0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
25ee0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
25ef0 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
25f00 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67  ed */.  int targ
25f10 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68  et,        /* Wh
25f20 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73  ere to write res
25f30 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72  ults */.  int sr
25f40 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  cReg,        /* 
25f50 53 6f 75 72 63 65 20 72 65 67 69 73 74 65 72 73  Source registers
25f60 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   if SQLITE_ECEL_
25f70 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67  REF */.  u8 flag
25f80 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  s           /* S
25f90 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61  QLITE_ECEL_* fla
25fa0 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  gs */.){.  struc
25fb0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
25fc0 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
25fd0 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79   j, n;.  u8 copy
25fe0 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  Op = (flags & SQ
25ff0 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f  LITE_ECEL_DUP) ?
26000 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43   OP_Copy : OP_SC
26010 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  opy;.  Vdbe *v =
26020 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
26030 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
26040 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
26050 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
26060 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
26070 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65  dbe!=0 );  /* Ne
26080 76 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61  ver gets this fa
26090 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20  r otherwise */. 
260a0 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   n = pList->nExp
260b0 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46  r;.  if( !ConstF
260c0 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
260d0 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ) flags &= ~SQLI
260e0 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a  TE_ECEL_FACTOR;.
260f0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
26100 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20  t->a, i=0; i<n; 
26110 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
26120 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
26130 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 23   pItem->pExpr;.#
26140 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
26150 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
26160 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 70 49  ENCES.    if( pI
26170 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20  tem->bSorterRef 
26180 29 7b 0a 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20  ){.      i--;.  
26190 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c      n--;.    }el
261a0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
261b0 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
261c0 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26  E_ECEL_REF)!=0 &
261d0 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  & (j = pItem->u.
261e0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30  x.iOrderByCol)>0
261f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c   ){.      if( fl
26200 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
26210 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20 20 20  L_OMITREF ){.   
26220 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20       i--;.      
26230 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c    n--;.      }el
26240 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
26250 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
26260 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65   copyOp, j+srcRe
26270 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  g-1, target+i);.
26280 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
26290 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53  e if( (flags & S
262a0 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
262b0 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  R)!=0 && sqlite3
262c0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
262d0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
262e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
262f0 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
26300 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
26310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26320 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  int inReg = sqli
26330 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
26340 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
26350 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
26360 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
26370 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20  get+i ){.       
26380 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
26390 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70        if( copyOp
263a0 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
263b0 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74     && (pOp=sqlit
263c0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d  e3VdbeGetOp(v, -
263d0 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  1))->opcode==OP_
263e0 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26  Copy.         &&
263f0 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33   pOp->p1+pOp->p3
26400 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20  +1==inReg.      
26410 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f     && pOp->p2+pO
26420 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b  p->p3+1==target+
26430 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  i.        ){.   
26440 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b         pOp->p3++
26450 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26460 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
26470 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
26480 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74  copyOp, inReg, t
26490 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
264a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
264b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
264c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
264d0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42  ate code for a B
264e0 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e  ETWEEN operator.
264f0 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57  .**.**    x BETW
26500 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a  EEN y AND z.**.*
26510 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65  * The above is e
26520 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a  quivalent to .**
26530 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20  .**    x>=y AND 
26540 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20  x<=z.**.** Code 
26550 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69  it as such, taki
26560 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68  ng care to do th
26570 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72  e common subexpr
26580 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e  ession.** elimin
26590 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a  ation of x..**.*
265a0 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70 61  * The xJumpIf pa
265b0 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
265c0 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a  es details:.**.*
265d0 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20  *    NULL:      
265e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f               Sto
265f0 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  re the boolean r
26600 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65 73  esult in reg[des
26610 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  t].**    sqlite3
26620 45 78 70 72 49 66 54 72 75 65 3a 20 20 20 20 20  ExprIfTrue:     
26630 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66   Jump to dest if
26640 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69   true.**    sqli
26650 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a 20  te3ExprIfFalse: 
26660 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74      Jump to dest
26670 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20   if false.**.** 
26680 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70  The jumpIfNull p
26690 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
266a0 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20 69  red if xJumpIf i
266b0 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  s NULL..*/.stati
266c0 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42  c void exprCodeB
266d0 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20  etween(.  Parse 
266e0 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
266f0 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
26700 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
26710 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
26720 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
26730 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73   BETWEEN express
26740 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
26750 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
26760 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  mp destination o
26770 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74 69  r storage locati
26780 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  on */.  void (*x
26790 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78 70  Jump)(Parse*,Exp
267a0 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20  r*,int,int), /* 
267b0 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a  Action to take *
267c0 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
267d0 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ll    /* Take th
267e0 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
267f0 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f  TWEEN is NULL */
26800 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41 6e  .){. Expr exprAn
26810 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e  d;     /* The AN
26820 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78  D operator in  x
26830 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f  >=y AND x<=z  */
26840 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74  .  Expr compLeft
26850 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d  ;    /* The  x>=
26860 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  y  term */.  Exp
26870 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f  r compRight;   /
26880 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72  * The  x<=z  ter
26890 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72  m */.  Expr expr
268a0 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  X;       /* The 
268b0 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f   x  subexpressio
268c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  n */.  int regFr
268d0 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70  ee1 = 0; /* Temp
268e0 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
268f0 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65 74  er */...  memset
26900 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73  (&compLeft, 0, s
26910 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
26920 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68  memset(&compRigh
26930 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
26940 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65  r));.  memset(&e
26950 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f  xprAnd, 0, sizeo
26960 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73  f(Expr));..  ass
26970 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
26980 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
26990 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
269a0 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e  exprX = *pExpr->
269b0 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
269c0 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
269d0 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
269e0 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70  &compLeft;.  exp
269f0 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
26a00 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70  ompRight;.  comp
26a10 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
26a20 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66  .  compLeft.pLef
26a30 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
26a40 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20  mpLeft.pRight = 
26a50 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
26a60 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f  a[0].pExpr;.  co
26a70 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
26a80 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  LE;.  compRight.
26a90 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
26aa0 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
26ab0 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
26ac0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
26ad0 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  .  exprToRegiste
26ae0 72 28 26 65 78 70 72 58 2c 20 65 78 70 72 43 6f  r(&exprX, exprCo
26af0 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  deVector(pParse,
26b00 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
26b10 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75 6d  e1));.  if( xJum
26b20 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28 70  p ){.    xJump(p
26b30 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
26b40 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26b50 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
26b60 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65 78 70   /* Mark the exp
26b70 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e 67  ression is being
26b80 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20   from the ON or 
26b90 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
26ba0 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20 73 6f  a join.    ** so
26bb0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
26bc0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
26bd0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e  ) routine will n
26be0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f  ot attempt to mo
26bf0 76 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74  ve.    ** it int
26c00 6f 20 74 68 65 20 50 61 72 73 65 2e 70 43 6f 6e  o the Parse.pCon
26c10 73 74 45 78 70 72 20 6c 69 73 74 2e 20 20 57 65  stExpr list.  We
26c20 20 73 68 6f 75 6c 64 20 75 73 65 20 61 20 6e 65   should use a ne
26c30 77 20 62 69 74 20 66 6f 72 20 74 68 69 73 2c 0a  w bit for this,.
26c40 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61 72 69      ** for clari
26c50 74 79 2c 20 62 75 74 20 77 65 20 61 72 65 20 6f  ty, but we are o
26c60 75 74 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  ut of bits in th
26c70 65 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65  e Expr.flags fie
26c80 6c 64 20 73 6f 20 77 65 0a 20 20 20 20 2a 2a 20  ld so we.    ** 
26c90 68 61 76 65 20 74 6f 20 72 65 75 73 65 20 74 68  have to reuse th
26ca0 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69  e EP_FromJoin bi
26cb0 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20  t.  Bummer. */. 
26cc0 20 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20 7c     exprX.flags |
26cd0 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20  = EP_FromJoin;. 
26ce0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
26cf0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
26d00 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 29   &exprAnd, dest)
26d10 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  ;.  }.  sqlite3R
26d20 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
26d30 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
26d40 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64  ..  /* Ensure ad
26d50 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65  equate test cove
26d60 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61  rage */.  testca
26d70 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
26d80 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
26d90 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
26da0 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
26db0 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26dc0 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26dd0 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
26de0 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
26df0 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
26e00 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26e10 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
26e20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
26e30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
26e40 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26e50 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
26e60 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
26e70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
26e80 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
26e90 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26ea0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26eb0 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
26ec0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
26ed0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26ee0 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26ef0 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
26f00 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
26f10 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
26f20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26f30 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
26f40 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
26f50 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
26f60 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
26f70 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
26f80 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
26f90 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
26fa0 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
26fb0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26fc0 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p==0 );.}../*.**
26fd0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
26fe0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
26ff0 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
27000 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
27010 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
27020 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
27030 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
27040 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
27050 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
27060 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
27070 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
27080 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
27090 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
270a0 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
270b0 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
270c0 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
270d0 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
270e0 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
270f0 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54  ll flag is SQLIT
27100 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a  E_JUMPIFNULL..**
27110 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
27120 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
27130 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
27140 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
27150 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
27160 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
27170 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
27180 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
27190 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
271a0 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
271b0 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
271c0 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
271d0 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
271e0 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
271f0 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
27200 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
27210 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
27220 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
27230 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
27240 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
27250 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
27260 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
27270 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
27280 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
27290 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
272a0 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
272b0 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
272c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
272d0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
272e0 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
272f0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
27300 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
27310 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
27320 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
27330 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
27340 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
27350 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
27360 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
27370 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a       return;  /*
27380 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44   Existence of VD
27390 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
273a0 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ller */.  if( NE
273b0 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20  VER(pExpr==0) ) 
273c0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77  return;  /* No w
273d0 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ay this can happ
273e0 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78  en */.  op = pEx
273f0 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
27400 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
27410 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
27420 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
27430 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
27440 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27450 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27460 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
27470 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
27480 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
27490 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c  t, d2,jumpIfNull
274a0 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
274b0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
274c0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
274d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
274e0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
274f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
27500 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
27510 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
27520 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27530 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
27540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27550 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
27560 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
27570 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
27580 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74  TK_OR: {.      t
27590 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
275a0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
275b0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
275c0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
275d0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
275e0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
275f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
27600 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
27610 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27620 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
27630 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
27640 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
27650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27660 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
27670 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
27680 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
27690 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
276a0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
276b0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
276c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
276d0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
276e0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
276f0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27700 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27710 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54      case TK_TRUT
27720 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  H: {.      int i
27730 73 4e 6f 74 3b 20 20 20 20 20 20 2f 2a 20 49 53  sNot;      /* IS
27740 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20   NOT TRUE or IS 
27750 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20  NOT FALSE */.   
27760 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20     int isTrue;  
27770 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72     /* IS TRUE or
27780 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a   IS NOT TRUE */.
27790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
277a0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
277b0 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70  .      isNot = p
277c0 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53  Expr->op2==TK_IS
277d0 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75  NOT;.      isTru
277e0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54  e = sqlite3ExprT
277f0 72 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d  ruthValue(pExpr-
27800 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
27810 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65  testcase( isTrue
27820 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20   && isNot );.   
27830 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
27840 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b  True && isNot );
27850 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72 75  .      if( isTru
27860 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20  e ^ isNot ){.   
27870 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27880 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
27890 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
278a0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
278b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e               isN
278c0 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ot ? SQLITE_JUMP
278d0 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20  IFNULL : 0);.   
278e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
278f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
27900 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
27910 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
27920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27930 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
27940 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  t ? SQLITE_JUMPI
27950 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20  FNULL : 0);.    
27960 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
27970 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
27980 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
27990 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
279a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
279b0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
279c0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
279d0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20  NOT );.      op 
279e0 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
279f0 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
27a00 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20       jumpIfNull 
27a10 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
27a20 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
27a30 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  hru */.    case 
27a40 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
27a50 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
27a60 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
27a70 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
27a80 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
27a90 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69  TK_EQ: {.      i
27aa0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
27ab0 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c  Vector(pExpr->pL
27ac0 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61  eft) ) goto defa
27ad0 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20  ult_expr;.      
27ae0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
27af0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
27b00 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
27b10 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
27b20 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
27b30 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
27b40 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
27b50 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
27b60 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
27b70 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
27b80 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
27b90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27ba0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
27bb0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
27bc0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
27bd0 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
27be0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
27bf0 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
27c00 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
27c10 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
27c20 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
27c30 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
27c40 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
27c50 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
27c60 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
27c70 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
27c80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
27c90 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
27ca0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
27cb0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
27cc0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
27cd0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
27ce0 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
27cf0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
27d00 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27d10 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
27d20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
27d30 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
27d40 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  se(op==OP_Eq);. 
27d50 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27d60 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
27d70 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
27d80 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
27d90 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27da0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
27db0 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  q && jumpIfNull!
27dc0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
27dd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
27de0 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
27df0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
27e00 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27e10 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
27e20 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
27e30 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l==SQLITE_NULLEQ
27e40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27e50 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
27e60 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
27e70 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
27e80 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  Q);.      testca
27e90 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
27ea0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27eb0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
27ec0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
27ed0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
27ee0 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
27ef0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
27f00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
27f10 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
27f20 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
27f30 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
27f40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27f50 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
27f60 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
27f70 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
27f80 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ULL );.      r1 
27f90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
27fa0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
27fb0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
27fc0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
27fd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27fe0 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
27ff0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
28000 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
28010 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
28020 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28030 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
28040 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28050 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
28060 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
28070 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
28080 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
28090 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
280a0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
280b0 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
280c0 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
280d0 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45  , dest, sqlite3E
280e0 78 70 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49  xprIfTrue, jumpI
280f0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
28100 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
28110 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
28120 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
28130 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
28140 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
28150 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
28160 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
28170 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
28180 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64  = jumpIfNull ? d
28190 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73  est : destIfFals
281a0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
281b0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
281c0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66  e, pExpr, destIf
281d0 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c  False, destIfNul
281e0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
281f0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
28200 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
28210 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
28220 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
28230 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
28240 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
28250 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
28260 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20  default_expr:.  
28270 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61      if( exprAlwa
28280 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b  ysTrue(pExpr) ){
28290 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
282a0 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
282b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
282c0 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
282d0 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  se(pExpr) ){.   
282e0 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f       /* No-op */
282f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28300 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
28310 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
28320 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
28330 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
28340 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28350 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31  Op3(v, OP_If, r1
28360 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
28370 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
28380 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
28390 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
283a0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
283b0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
283c0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
283d0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
283e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
283f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
28400 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
28410 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
28420 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
28430 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
28440 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f  egFree2);  .}../
28450 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
28460 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
28470 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
28480 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
28490 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
284a0 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
284b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
284c0 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
284d0 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
284e0 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
284f0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
28500 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
28510 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
28520 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
28530 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
28540 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
28550 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
28560 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49  mpIfNull is SQLI
28570 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72  TE_JUMPIFNULL or
28580 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66   fall through if
28590 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69   jumpIfNull.** i
285a0 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s 0..*/.void sql
285b0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
285c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
285d0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
285e0 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
285f0 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
28600 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
28610 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
28620 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
28630 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
28640 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
28650 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
28660 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
28670 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
28680 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
28690 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
286a0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f  ==0) ) return; /
286b0 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
286c0 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
286d0 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70  aller */.  if( p
286e0 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74  Expr==0 )    ret
286f0 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76  urn;..  /* The v
28700 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f  alue of pExpr->o
28710 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c  p and op are rel
28720 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
28730 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
28740 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
28750 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20        op.  **   
28760 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20      ---------   
28770 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
28780 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  -.  **       TK_
28790 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20  ISNULL          
287a0 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20  OP_NotNull.  ** 
287b0 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c        TK_NOTNULL
287c0 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75           OP_IsNu
287d0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
287e0 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _NE             
287f0 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20   OP_Eq.  **     
28800 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20    TK_EQ         
28810 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20       OP_Ne.  ** 
28820 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20        TK_GT     
28830 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20           OP_Le. 
28840 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20   **       TK_LE 
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
28860 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Gt.  **       TK
28870 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _GE             
28880 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Lt.  **     
28890 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20    TK_LT         
288a0 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a       OP_Ge.  **.
288b0 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76    ** For other v
288c0 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e  alues of pExpr->
288d0 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69  op, op is undefi
288e0 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a  ned and unused..
288f0 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    ** The value o
28900 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
28910 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61  nstants are arra
28920 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77  nged such that w
28930 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75  e.  ** can compu
28940 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61  te the mapping a
28950 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66  bove using the f
28960 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
28970 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74  ion..  ** Assert
28980 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20  ()s verify that 
28990 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
289a0 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f  is correct..  */
289b0 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d  .  op = ((pExpr-
289c0 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  >op+(TK_ISNULL&1
289d0 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c  ))^1)-(TK_ISNULL
289e0 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  &1);..  /* Verif
289f0 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d  y correct alignm
28a00 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  ent of TK_ and O
28a10 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a  P_ constants.  *
28a20 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  /.  assert( pExp
28a30 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  r->op!=TK_ISNULL
28a40 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75   || op==OP_NotNu
28a50 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
28a60 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f  pExpr->op!=TK_NO
28a70 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TNULL || op==OP_
28a80 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  IsNull );.  asse
28a90 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28aa0 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45  K_NE || op==OP_E
28ab0 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  q );.  assert( p
28ac0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
28ad0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  || op==OP_Ne );.
28ae0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
28af0 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70  >op!=TK_LT || op
28b00 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ge );.  ass
28b10 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
28b20 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LE || op==OP_
28b30 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Gt );.  assert( 
28b40 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54  pExpr->op!=TK_GT
28b50 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b   || op==OP_Le );
28b60 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
28b70 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f  ->op!=TK_GE || o
28b80 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73  p==OP_Lt );..  s
28b90 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
28ba0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
28bb0 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  AND: {.      tes
28bc0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
28bd0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
28be0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
28bf0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
28c00 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
28c10 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
28c20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
28c30 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
28c40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
28c50 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
28c60 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
28c70 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28c80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28c90 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
28ca0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
28cb0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
28cc0 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
28cd0 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
28ce0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
28cf0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28d00 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
28d10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
28d20 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
28d30 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28d40 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53  d2, jumpIfNull^S
28d50 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
28d60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28d70 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
28d80 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
28d90 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
28da0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28db0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
28dc0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
28dd0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
28de0 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
28df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28e00 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
28e10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
28e20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
28e30 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
28e40 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
28e50 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
28e60 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
28e70 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28e80 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
28e90 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
28ea0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
28eb0 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a    case TK_TRUTH:
28ec0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e   {.      int isN
28ed0 6f 74 3b 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20  ot;   /* IS NOT 
28ee0 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46  TRUE or IS NOT F
28ef0 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ALSE */.      in
28f00 74 20 69 73 54 72 75 65 3b 20 20 2f 2a 20 49 53  t isTrue;  /* IS
28f10 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20   TRUE or IS NOT 
28f20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65  TRUE */.      te
28f30 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
28f40 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ll==0 );.      i
28f50 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70  sNot = pExpr->op
28f60 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20  2==TK_ISNOT;.   
28f70 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69     isTrue = sqli
28f80 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75  te3ExprTruthValu
28f90 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  e(pExpr->pRight)
28fa0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28fb0 28 20 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f  ( isTrue && isNo
28fc0 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
28fd0 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20  ase( !isTrue && 
28fe0 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69  isNot );.      i
28ff0 66 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f  f( isTrue ^ isNo
29000 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
29010 49 53 20 54 52 55 45 20 61 6e 64 20 49 53 20 4e  IS TRUE and IS N
29020 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  OT FALSE */.    
29030 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
29040 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
29050 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
29060 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
29070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
29080 4e 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45  Not ? 0 : SQLITE
29090 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20  _JUMPIFNULL);.. 
290a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
290b0 20 20 20 20 2f 2a 20 49 53 20 46 41 4c 53 45 20      /* IS FALSE 
290c0 61 6e 64 20 49 53 20 4e 4f 54 20 54 52 55 45 20  and IS NOT TRUE 
290d0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
290e0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
290f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
29100 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20  t, dest,.       
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53     isNot ? 0 : S
29130 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
29140 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
29150 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
29160 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
29170 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
29180 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
29190 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
291a0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
291b0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
291c0 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
291d0 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f    op = (pExpr->o
291e0 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e  p==TK_IS) ? TK_N
291f0 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  E : TK_EQ;.     
29200 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51   jumpIfNull = SQ
29210 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
29220 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
29230 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
29240 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
29250 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
29260 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
29270 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
29280 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
29290 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  Q: {.      if( s
292a0 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
292b0 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  or(pExpr->pLeft)
292c0 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f   ) goto default_
292d0 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74  expr;.      test
292e0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
292f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
29300 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
29310 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
29320 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
29330 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
29340 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
29350 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
29360 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
29370 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
29380 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
29390 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
293a0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
293b0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
293c0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
293d0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
293e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
293f0 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
29400 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
29410 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
29420 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
29430 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
29440 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
29450 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
29460 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
29470 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
29480 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
29490 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
294a0 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
294b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
294c0 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
294d0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
294e0 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
294f0 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
29500 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
29510 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
29520 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
29530 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
29540 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
29550 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
29560 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
29570 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
29580 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
29590 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
295a0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
295b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
295c0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
295d0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
295e0 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
295f0 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  e(op==OP_Ne);.  
29600 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
29610 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
29620 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
29630 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
29640 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
29650 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
29660 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
29670 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
29680 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29690 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
296a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
296b0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
296c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
296d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
296e0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
296f0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
29700 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
29710 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
29720 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
29730 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
29740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29750 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
29760 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
29770 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
29780 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f  NULL );   VdbeCo
29790 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
297a0 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
297b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
297c0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56  TK_NOTNULL );  V
297d0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
297e0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
297f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
29800 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
29810 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29820 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
29830 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
29840 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
29850 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
29860 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
29870 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
29880 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78   dest, sqlite3Ex
29890 70 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49  prIfFalse, jumpI
298a0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
298b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
298c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
298d0 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
298e0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
298f0 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29  if( jumpIfNull )
29900 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29910 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
29920 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
29930 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
29940 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
29950 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
29960 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
29970 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  el(v);.        s
29980 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
29990 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
299a0 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c  dest, destIfNull
299b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
299c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
299d0 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
299e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
299f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
29a00 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
29a10 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
29a20 65 78 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28  expr: .      if(
29a30 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
29a40 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
29a50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
29a60 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
29a70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70     }else if( exp
29a80 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70  rAlwaysTrue(pExp
29a90 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
29aa0 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   no-op */.      
29ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
29ac0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
29ad0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
29ae0 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
29af0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
29b00 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
29b10 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65  OP_IfNot, r1, de
29b20 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
29b30 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
29b40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
29b50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
29b60 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
29b70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29b80 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
29b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
29ba0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
29bb0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
29bc0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
29bd0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
29be0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
29bf0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
29c00 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ee2);.}../*.** L
29c10 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  ike sqlite3ExprI
29c20 66 46 61 6c 73 65 28 29 20 65 78 63 65 70 74 20  fFalse() except 
29c30 74 68 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d  that a copy is m
29c40 61 64 65 20 6f 66 20 70 45 78 70 72 20 62 65 66  ade of pExpr bef
29c50 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65  ore.** code gene
29c60 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74  ration, and that
29c70 20 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64   copy is deleted
29c80 20 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65   after code gene
29c90 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20  ration. This.** 
29ca0 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
29cb0 20 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20   original pExpr 
29cc0 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  is unchanged..*/
29cd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
29ce0 72 49 66 46 61 6c 73 65 44 75 70 28 50 61 72 73  rIfFalseDup(Pars
29cf0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
29d00 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
29d10 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ,int jumpIfNull)
29d20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
29d30 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
29d40 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71  Expr *pCopy = sq
29d50 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
29d60 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66   pExpr, 0);.  if
29d70 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
29d80 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ed==0 ){.    sql
29d90 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
29da0 70 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64  pParse, pCopy, d
29db0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
29dc0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
29dd0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
29de0 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  opy);.}../*.** E
29df0 78 70 72 65 73 73 69 6f 6e 20 70 56 61 72 20 69  xpression pVar i
29e00 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
29e10 62 65 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62  be an SQL variab
29e20 6c 65 2e 20 70 45 78 70 72 20 6d 61 79 20 62 65  le. pExpr may be
29e30 20 61 6e 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20   any.** type of 
29e40 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
29e50 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
29e60 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65  simple SQL value
29e70 20 2d 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72   - an integer, r
29e80 65 61 6c 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f  eal, string, blo
29e90 62 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c  b.** or NULL val
29ea0 75 65 20 2d 20 74 68 65 6e 20 74 68 65 20 56 44  ue - then the VD
29eb0 42 45 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  BE currently bei
29ec0 6e 67 20 70 72 65 70 61 72 65 64 20 69 73 20 63  ng prepared is c
29ed0 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20  onfigured.** to 
29ee0 72 65 2d 70 72 65 70 61 72 65 20 65 61 63 68 20  re-prepare each 
29ef0 74 69 6d 65 20 61 20 6e 65 77 20 76 61 6c 75 65  time a new value
29f00 20 69 73 20 62 6f 75 6e 64 20 74 6f 20 76 61 72   is bound to var
29f10 69 61 62 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a  iable pVar..**.*
29f20 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  * Additionally, 
29f30 69 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69  if pExpr is a si
29f40 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 61  mple SQL value a
29f50 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  nd the value is 
29f60 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74  the.** same as t
29f70 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 62 6f  hat currently bo
29f80 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20  und to variable 
29f90 70 56 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69  pVar, non-zero i
29fa0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f  s returned..** O
29fb0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
29fc0 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20   values are not 
29fd0 74 68 65 20 73 61 6d 65 20 6f 72 20 69 66 20 70  the same or if p
29fe0 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 73 69  Expr is not a si
29ff0 6d 70 6c 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75  mple.** SQL valu
2a000 65 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72  e, zero is retur
2a010 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2a020 6e 74 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61  nt exprCompareVa
2a030 72 69 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  riable(Parse *pP
2a040 61 72 73 65 2c 20 45 78 70 72 20 2a 70 56 61 72  arse, Expr *pVar
2a050 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2a060 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20    int res = 0;. 
2a070 20 69 6e 74 20 69 56 61 72 3b 0a 20 20 73 71 6c   int iVar;.  sql
2a080 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20  ite3_value *pL, 
2a090 2a 70 52 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71  *pR = 0;.  .  sq
2a0a0 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78  lite3ValueFromEx
2a0b0 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  pr(pParse->db, p
2a0c0 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46  Expr, SQLITE_UTF
2a0d0 38 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  8, SQLITE_AFF_BL
2a0e0 4f 42 2c 20 26 70 52 29 3b 0a 20 20 69 66 28 20  OB, &pR);.  if( 
2a0f0 70 52 20 29 7b 0a 20 20 20 20 69 56 61 72 20 3d  pR ){.    iVar =
2a100 20 70 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   pVar->iColumn;.
2a110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
2a120 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
2a130 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a  ->pVdbe, iVar);.
2a140 20 20 20 20 70 4c 20 3d 20 73 71 6c 69 74 65 33      pL = sqlite3
2a150 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75  VdbeGetBoundValu
2a160 65 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65  e(pParse->pRepre
2a170 70 61 72 65 2c 20 69 56 61 72 2c 20 53 51 4c 49  pare, iVar, SQLI
2a180 54 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20  TE_AFF_BLOB);.  
2a190 20 20 69 66 28 20 70 4c 20 29 7b 0a 20 20 20 20    if( pL ){.    
2a1a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
2a1b0 6c 75 65 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51  lue_type(pL)==SQ
2a1c0 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
2a1d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
2a1e0 75 65 5f 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20  ue_text(pL); /* 
2a1f0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 65 6e  Make sure the en
2a200 63 6f 64 69 6e 67 20 69 73 20 55 54 46 2d 38 20  coding is UTF-8 
2a210 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
2a220 20 72 65 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74   res =  0==sqlit
2a230 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c  e3MemCompare(pL,
2a240 20 70 52 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20   pR, 0);.    }. 
2a250 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
2a260 72 65 65 28 70 52 29 3b 0a 20 20 20 20 73 71 6c  ree(pR);.    sql
2a270 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c  ite3ValueFree(pL
2a280 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2a290 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44   res;.}../*.** D
2a2a0 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
2a2b0 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
2a2c0 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
2a2d0 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
2a2e0 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
2a2f0 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20   are completely 
2a300 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75  identical.  Retu
2a310 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66  rn 1 if they dif
2a320 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61  fer only.** by a
2a330 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
2a340 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76  r at the top lev
2a350 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66  el.  Return 2 if
2a360 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
2a370 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20  rences.** other 
2a380 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76  than the top-lev
2a390 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  el COLLATE opera
2a3a0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  tor..**.** If an
2a3b0 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20  y subelement of 
2a3c0 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62  pB has Expr.iTab
2a3d0 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74  le==(-1) then it
2a3e0 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
2a3f0 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  o compare equal 
2a400 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  to an equivalent
2a410 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77   element in pA w
2a420 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  ith Expr.iTable=
2a430 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  =iTab..**.** The
2a440 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62   pA side might b
2a450 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53  e using TK_REGIS
2a460 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73  TER.  If that is
2a470 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42   the case and pB
2a480 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67   is.** not using
2a490 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74   TK_REGISTER but
2a4a0 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71   is otherwise eq
2a4b0 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73  uivalent, then s
2a4c0 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  till return 0..*
2a4d0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
2a4e0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2a4f0 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69   return 2 even i
2a500 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
2a510 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
2a520 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
2a530 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
2a540 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
2a550 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
2a560 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
2a570 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62  turn 2 just to b
2a580 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74  e safe.  So if t
2a590 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
2a5a0 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79  eturns 2, then y
2a5b0 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  ou do not really
2a5c0 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69   know for certai
2a5d0 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  n if the two.** 
2a5e0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
2a5f0 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69  the same.  But i
2a600 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72  f you get a 0 or
2a610 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20   1 return, then 
2a620 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75  you.** can be su
2a630 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
2a640 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
2a650 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20    In the places 
2a660 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  where.** this ro
2a670 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69  utine is used, i
2a680 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20  t does not hurt 
2a690 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20  to get an extra 
2a6a0 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74  2 - that.** just
2a6b0 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
2a6c0 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73   some slightly s
2a6d0 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74  lower code.  But
2a6e0 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e   returning.** an
2a6f0 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20   incorrect 0 or 
2a700 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  1 could lead to 
2a710 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a  a malfunction..*
2a720 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69  *.** If pParse i
2a730 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
2a740 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d  TK_VARIABLE term
2a750 73 20 69 6e 20 70 41 20 77 69 74 68 20 62 69 6e  s in pA with bin
2a760 64 69 6e 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72  dings in.** pPar
2a770 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 20 63  se->pReprepare c
2a780 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 61 67  an be matched ag
2a790 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 73 20 69  ainst literals i
2a7a0 6e 20 70 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70  n pB.  The .** p
2a7b0 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78  Parse->pVdbe->ex
2a7c0 70 6d 61 73 6b 20 62 69 74 6d 61 73 6b 20 69 73  pmask bitmask is
2a7d0 20 75 70 64 61 74 65 64 20 66 6f 72 20 65 61 63   updated for eac
2a7e0 68 20 76 61 72 69 61 62 6c 65 20 72 65 66 65 72  h variable refer
2a7f0 65 6e 63 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61  enced..** If pPa
2a800 72 73 65 20 69 73 20 4e 55 4c 4c 20 28 74 68 65  rse is NULL (the
2a810 20 6e 6f 72 6d 61 6c 20 63 61 73 65 29 20 74 68   normal case) th
2a820 65 6e 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42  en any TK_VARIAB
2a830 4c 45 20 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41  LE term in .** A
2a840 72 67 75 6d 65 6e 74 20 70 50 61 72 73 65 20 73  rgument pParse s
2a850 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62  hould normally b
2a860 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73  e NULL. If it is
2a870 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41   not NULL and pA
2a880 20 6f 72 0a 2a 2a 20 70 42 20 63 61 75 73 65 73   or.** pB causes
2a890 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20   a return value 
2a8a0 6f 66 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  of 2..*/.int sql
2a8b0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2a8c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
2a8d0 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70  xpr *pA, Expr *p
2a8e0 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
2a8f0 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  u32 combinedFlag
2a900 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c  s;.  if( pA==0 |
2a910 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72  | pB==0 ){.    r
2a920 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30  eturn pB==pA ? 0
2a930 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20   : 2;.  }.  if( 
2a940 70 50 61 72 73 65 20 26 26 20 70 41 2d 3e 6f 70  pParse && pA->op
2a950 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 26 26  ==TK_VARIABLE &&
2a960 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69   exprCompareVari
2a970 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 41 2c  able(pParse, pA,
2a980 20 70 42 29 20 29 7b 0a 20 20 20 20 72 65 74 75   pB) ){.    retu
2a990 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62  rn 0;.  }.  comb
2a9a0 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e  inedFlags = pA->
2a9b0 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67  flags | pB->flag
2a9c0 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  s;.  if( combine
2a9d0 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  dFlags & EP_IntV
2a9e0 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20  alue ){.    if( 
2a9f0 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66  (pA->flags&pB->f
2aa00 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65  lags&EP_IntValue
2aa10 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56  )!=0 && pA->u.iV
2aa20 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c  alue==pB->u.iVal
2aa30 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ue ){.      retu
2aa40 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
2aa50 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
2aa60 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
2aa70 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  op ){.    if( pA
2aa80 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
2aa90 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
2aaa0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2aab0 41 2d 3e 70 4c 65 66 74 2c 70 42 2c 69 54 61 62  A->pLeft,pB,iTab
2aac0 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
2aad0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2aae0 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f   if( pB->op==TK_
2aaf0 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
2ab00 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2ab10 61 72 73 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65  arse, pA,pB->pLe
2ab20 66 74 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20  ft,iTab)<2 ){.  
2ab30 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2ab40 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
2ab50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
2ab60 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op!=TK_COLUMN &&
2ab70 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f   pA->op!=TK_AGG_
2ab80 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e  COLUMN && pA->u.
2ab90 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  zToken ){.    if
2aba0 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  ( pA->op==TK_FUN
2abb0 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69  CTION ){.      i
2abc0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
2abd0 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
2abe0 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
2abf0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2ac00 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70  }else if( pA->op
2ac10 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a  ==TK_COLLATE ){.
2ac20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2ac30 33 5f 73 74 72 69 63 6d 70 28 70 41 2d 3e 75 2e  3_stricmp(pA->u.
2ac40 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
2ac50 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ken)!=0 ) return
2ac60 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
2ac70 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a  ( strcmp(pA->u.z
2ac80 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
2ac90 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  en)!=0 ){.      
2aca0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
2acb0 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66    }.  if( (pA->f
2acc0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
2acd0 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
2ace0 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
2acf0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
2ad00 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65   ALWAYS((combine
2ad10 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65  dFlags & EP_Toke
2ad20 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20  nOnly)==0) ){.  
2ad30 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c    if( combinedFl
2ad40 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
2ad50 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  ct ) return 2;. 
2ad60 20 20 20 69 66 28 20 28 63 6f 6d 62 69 6e 65 64     if( (combined
2ad70 46 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64  Flags & EP_Fixed
2ad80 43 6f 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  Col)==0.     && 
2ad90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2ada0 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70  re(pParse, pA->p
2adb0 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  Left, pB->pLeft,
2adc0 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
2add0 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
2ade0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2adf0 61 72 73 65 2c 20 70 41 2d 3e 70 52 69 67 68 74  arse, pA->pRight
2ae00 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pB->pRight, iT
2ae10 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
2ae20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2ae30 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
2ae40 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e  A->x.pList, pB->
2ae50 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29  x.pList, iTab) )
2ae60 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 61   return 2;.    a
2ae70 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64  ssert( (combined
2ae80 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63  Flags & EP_Reduc
2ae90 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ed)==0 );.    if
2aea0 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52  ( pA->op!=TK_STR
2aeb0 49 4e 47 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54  ING && pA->op!=T
2aec0 4b 5f 54 52 55 45 46 41 4c 53 45 20 29 7b 0a 20  K_TRUEFALSE ){. 
2aed0 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f       if( pA->iCo
2aee0 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d  lumn!=pB->iColum
2aef0 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  n ) return 2;.  
2af00 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62      if( pA->iTab
2af10 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a  le!=pB->iTable .
2af20 20 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69         && (pA->i
2af30 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e  Table!=iTab || N
2af40 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e  EVER(pB->iTable>
2af50 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b  =0)) ) return 2;
2af60 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
2af70 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
2af80 57 46 55 4e 43 0a 20 20 20 20 2f 2a 20 4a 75 73  WFUNC.    /* Jus
2af90 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 74  tification for t
2afa0 68 65 20 61 73 73 65 72 74 28 29 3a 0a 20 20 20  he assert():.   
2afb0 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74   ** window funct
2afc0 69 6f 6e 73 20 68 61 76 65 20 70 2d 3e 6f 70 3d  ions have p->op=
2afd0 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 62 75 74  =TK_FUNCTION but
2afe0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2aff0 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 68 61 76 65  ions.    ** have
2b000 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46   p->op==TK_AGG_F
2b010 55 4e 43 54 49 4f 4e 2e 20 20 53 6f 20 61 6e 79  UNCTION.  So any
2b020 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77   comparison betw
2b030 65 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65  een an aggregate
2b040 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  .    ** function
2b050 20 61 6e 64 20 61 20 77 69 6e 64 6f 77 20 66 75   and a window fu
2b060 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68 61  nction should ha
2b070 76 65 20 66 61 69 6c 65 64 20 62 65 66 6f 72 65  ve failed before
2b080 20 72 65 61 63 68 69 6e 67 0a 20 20 20 20 2a 2a   reaching.    **
2b090 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 41 6e   this point.  An
2b0a0 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  d, it is not pos
2b0b0 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20  sible to have a 
2b0c0 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
2b0d0 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 73 63 61  and.    ** a sca
2b0e0 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  lar function wit
2b0f0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
2b100 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  and number of ar
2b110 67 75 6d 65 6e 74 73 2e 20 20 53 6f 0a 20 20 20  guments.  So.   
2b120 20 2a 2a 20 69 66 20 77 65 20 72 65 61 63 68 20   ** if we reach 
2b130 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 69 74 68  this point, eith
2b140 65 72 20 41 20 61 6e 64 20 42 20 62 6f 74 68 20  er A and B both 
2b150 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
2b160 20 6f 72 0a 20 20 20 20 2a 2a 20 6e 65 69 74 68   or.    ** neith
2b170 65 72 20 61 72 65 20 61 20 77 69 6e 64 6f 77 20  er are a window 
2b180 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  functions. */.  
2b190 20 20 61 73 73 65 72 74 28 20 28 70 41 2d 3e 70    assert( (pA->p
2b1a0 57 69 6e 3d 3d 30 29 3d 3d 28 70 42 2d 3e 70 57  Win==0)==(pB->pW
2b1b0 69 6e 3d 3d 30 29 20 29 3b 0a 0a 20 20 20 20 69  in==0) );..    i
2b1c0 66 28 20 70 41 2d 3e 70 57 69 6e 21 3d 30 20 29  f( pA->pWin!=0 )
2b1d0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
2b1e0 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65  te3WindowCompare
2b1f0 28 70 50 61 72 73 65 2c 70 41 2d 3e 70 57 69 6e  (pParse,pA->pWin
2b200 2c 70 42 2d 3e 70 57 69 6e 29 21 3d 30 20 29 20  ,pB->pWin)!=0 ) 
2b210 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
2b220 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
2b230 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2b240 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72  Compare two Expr
2b250 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52  List objects.  R
2b260 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20  eturn 0 if they 
2b270 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
2b280 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  d .** non-zero i
2b290 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
2b2a0 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
2b2b0 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e  If any subelemen
2b2c0 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72  t of pB has Expr
2b2d0 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68  .iTable==(-1) th
2b2e0 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  en it is allowed
2b2f0 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65  .** to compare e
2b300 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76  qual to an equiv
2b310 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e  alent element in
2b320 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54   pA with Expr.iT
2b330 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a  able==iTab..**.*
2b340 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
2b350 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  ight return non-
2b360 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c  zero for equival
2b370 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20  ent ExprLists.  
2b380 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73  The.** only cons
2b390 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20  equence will be 
2b3a0 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a  disabled optimiz
2b3b0 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69  ations.  But thi
2b3c0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73  s routine.** mus
2b3d0 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30  t never return 0
2b3e0 20 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72   if the two Expr
2b3f0 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65  List objects are
2b400 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a   different, or.*
2b410 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20  * a malfunction 
2b420 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a  will result..**.
2b430 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e  ** Two NULL poin
2b440 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ters are conside
2b450 72 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61  red to be the sa
2b460 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20  me.  But a NULL 
2b470 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79  pointer.** alway
2b480 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61  s differs from a
2b490 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65   non-NULL pointe
2b4a0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
2b4b0 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
2b4c0 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45  (ExprList *pA, E
2b4d0 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74  xprList *pB, int
2b4e0 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b   iTab){.  int i;
2b4f0 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20  .  if( pA==0 && 
2b500 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pB==0 ) return 0
2b510 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c  ;.  if( pA==0 ||
2b520 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pB==0 ) return 
2b530 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78  1;.  if( pA->nEx
2b540 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20  pr!=pB->nExpr ) 
2b550 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28  return 1;.  for(
2b560 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72  i=0; i<pA->nExpr
2b570 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
2b580 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61   *pExprA = pA->a
2b590 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45  [i].pExpr;.    E
2b5a0 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42  xpr *pExprB = pB
2b5b0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
2b5c0 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73    if( pA->a[i].s
2b5d0 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b  ortOrder!=pB->a[
2b5e0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72  i].sortOrder ) r
2b5f0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
2b600 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2b610 61 72 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70  are(0, pExprA, p
2b620 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72  ExprB, iTab) ) r
2b630 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
2b640 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2b650 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  * Like sqlite3Ex
2b660 70 72 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65  prCompare() exce
2b670 70 74 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  pt COLLATE opera
2b680 74 6f 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d  tors at the top-
2b690 6c 65 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e  level.** are ign
2b6a0 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ored..*/.int sql
2b6b0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53  ite3ExprCompareS
2b6c0 6b 69 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78  kip(Expr *pA, Ex
2b6d0 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
2b6e0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2b6f0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
2b700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73  ,.             s
2b710 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
2b720 6c 6c 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20  llate(pA),.     
2b730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2b740 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2b750 42 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  B),.            
2b760 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iTab);.}../*.**
2b770 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2b780 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65  we can prove the
2b790 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73   pE2 will always
2b7a0 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20   be true if pE1 
2b7b0 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74  is.** true.  Ret
2b7c0 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20  urn false if we 
2b7d0 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  cannot complete 
2b7e0 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20  the proof or if 
2b7f0 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  pE2 might.** be 
2b800 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73  false.  Examples
2b810 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a  :.**.**     pE1:
2b820 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a   x==5       pE2:
2b830 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
2b840 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
2b850 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20  *     pE1: x>0  
2b860 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
2b870 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
2b880 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
2b890 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20   pE1: x=21      
2b8a0 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d   pE2: x=21 OR y=
2b8b0 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74  43     Result: t
2b8c0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
2b8d0 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20  x!=123     pE2: 
2b8e0 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
2b8f0 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
2b900 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20       pE1: x!=?1 
2b910 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
2b920 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
2b930 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
2b940 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70  E1: x IS NULL  p
2b950 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
2b960 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c  L    Result: fal
2b970 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  se.**     pE1: x
2b980 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78   IS ?2    pE2: x
2b990 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
2b9a0 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Reuslt: false.**
2b9b0 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69  .** When compari
2b9c0 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  ng TK_COLUMN nod
2b9d0 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61  es between pE1 a
2b9e0 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68  nd pE2, if pE2 h
2b9f0 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c  as.** Expr.iTabl
2ba00 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20  e<0 then assume 
2ba10 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67  a table number g
2ba20 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a  iven by iTab..**
2ba30 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73  .** If pParse is
2ba40 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
2ba50 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f  the values of bo
2ba60 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e  und variables in
2ba70 20 70 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d   pE1 are .** com
2ba80 70 61 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69  pared against li
2ba90 74 65 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20  teral values in 
2baa0 70 45 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e  pE2 and pParse->
2bab0 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69  pVdbe->expmask i
2bac0 73 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f  s.** modified to
2bad0 20 72 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f   record which bo
2bae0 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 61 72  und variables ar
2baf0 65 20 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49  e referenced.  I
2bb00 66 20 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20  f pParse .** is 
2bb10 4e 55 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65  NULL, then false
2bb20 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
2bb30 64 20 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e  d if pE1 contain
2bb40 73 20 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69  s any bound vari
2bb50 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ables..**.** Whe
2bb60 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
2bb70 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72  rn false.  Retur
2bb80 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20  ning true might 
2bb90 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
2bba0 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e  ce.** improvemen
2bbb0 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61  t.  Returning fa
2bbc0 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  lse might cause 
2bbd0 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  a performance re
2bbe0 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  duction, but.** 
2bbf0 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67  it will always g
2bc00 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  ive the correct 
2bc10 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68 65  answer and is he
2bc20 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e  nce always safe.
2bc30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2bc40 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50  xprImpliesExpr(P
2bc50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
2bc60 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70  pr *pE1, Expr *p
2bc70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  E2, int iTab){. 
2bc80 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2bc90 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
2bca0 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d  pE1, pE2, iTab)=
2bcb0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2bcc0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
2bcd0 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20  2->op==TK_OR.   
2bce0 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49  && (sqlite3ExprI
2bcf0 6d 70 6c 69 65 73 45 78 70 72 28 70 50 61 72 73  mpliesExpr(pPars
2bd00 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65  e, pE1, pE2->pLe
2bd10 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20  ft, iTab).      
2bd20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2bd30 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
2bd40 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45  (pParse, pE1, pE
2bd50 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29  2->pRight, iTab)
2bd60 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75   ).  ){.    retu
2bd70 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
2bd80 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  pE2->op==TK_NOTN
2bd90 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d  ULL && pE1->op!=
2bda0 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31  TK_ISNULL && pE1
2bdb0 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20  ->op!=TK_IS ){. 
2bdc0 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71     Expr *pX = sq
2bdd0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2bde0 6c 61 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29  late(pE1->pLeft)
2bdf0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2be00 70 58 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29  pX!=pE1->pLeft )
2be10 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2be20 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
2be30 72 73 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c  rse, pX, pE2->pL
2be40 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20  eft, iTab)==0 ) 
2be50 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2be60 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2be70 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 45  ** This is the E
2be80 78 70 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63  xpr node callbac
2be90 6b 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70  k for sqlite3Exp
2bea0 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52  rImpliesNotNullR
2beb0 6f 77 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ow()..** If the 
2bec0 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
2bed0 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
2bee0 65 20 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b  e table at pWalk
2bef0 65 72 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65  er->iCur.** have
2bf00 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 63 6f 6c 75   a non-NULL colu
2bf10 6d 6e 2c 20 74 68 65 6e 20 73 65 74 20 70 57 61  mn, then set pWa
2bf20 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31  lker->eCode to 1
2bf30 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2f 0a 73   and abort..*/.s
2bf40 74 61 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65  tatic int implie
2bf50 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b  sNotNullRow(Walk
2bf60 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2bf70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20  r *pExpr){.  /* 
2bf80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2bf90 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
2bfa0 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
2bfb0 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 73 6f 20  ressions and so 
2bfc0 69 74 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 68  it.  ** cannot h
2bfd0 61 76 65 20 61 6e 79 20 54 4b 5f 41 47 47 5f 43  ave any TK_AGG_C
2bfe0 4f 4c 55 4d 4e 20 65 6e 74 72 69 65 73 20 62 65  OLUMN entries be
2bff0 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
2c000 6f 6e 6c 79 20 66 6f 75 6e 64 0a 20 20 2a 2a 20  only found.  ** 
2c010 69 6e 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  in HAVING clause
2c020 73 2e 20 20 57 65 20 63 61 6e 20 67 65 74 20 61  s.  We can get a
2c030 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
2c040 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
2c050 73 65 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68 61  se,.  ** but tha
2c060 74 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 20  t is an illegal 
2c070 63 6f 6e 73 74 72 75 63 74 20 61 6e 64 20 74 68  construct and th
2c080 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20  e query will be 
2c090 72 65 6a 65 63 74 65 64 20 61 74 0a 20 20 2a 2a  rejected at.  **
2c0a0 20 61 20 6c 61 74 65 72 20 73 74 61 67 65 20 6f   a later stage o
2c0b0 66 20 70 72 6f 63 65 73 73 69 6e 67 2c 20 73 6f  f processing, so
2c0c0 20 74 68 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43   the TK_AGG_FUNC
2c0d0 54 49 4f 4e 20 63 61 73 65 20 64 6f 65 73 20 6e  TION case does n
2c0e0 6f 74 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ot.  ** need to 
2c0f0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 68 65  be considered he
2c100 72 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  re. */.  assert(
2c110 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
2c120 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74  GG_COLUMN );.  t
2c130 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2c140 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
2c150 49 4f 4e 20 29 3b 0a 0a 20 20 69 66 28 20 45 78  ION );..  if( Ex
2c160 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2c170 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
2c180 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 50  ) ) return WRC_P
2c190 72 75 6e 65 3b 0a 20 20 73 77 69 74 63 68 28 20  rune;.  switch( 
2c1a0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
2c1b0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
2c1c0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
2c1d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
2c1e0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
2c1f0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
2c200 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
2c210 5f 43 41 53 45 3a 0a 20 20 20 20 63 61 73 65 20  _CASE:.    case 
2c220 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20  TK_IN:.    case 
2c230 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
2c240 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2c250 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
2c260 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c270 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c280 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74  K_NOT );.      t
2c290 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2c2a0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
2c2b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2c2c0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2c2d0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
2c2e0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2c2f0 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74  TK_OR );.      t
2c300 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2c310 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20  op==TK_CASE );. 
2c320 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2c330 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
2c340 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2c350 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2c360 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
2c370 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2c380 75 6e 65 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  une;.    case TK
2c390 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 69  _COLUMN:.      i
2c3a0 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43  f( pWalker->u.iC
2c3b0 75 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  ur==pExpr->iTabl
2c3c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61  e ){.        pWa
2c3d0 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
2c3e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c3f0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
2c400 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
2c410 57 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20  WRC_Prune;..    
2c420 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
2c430 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
2c440 20 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   use constraints
2c450 20 6c 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53   like x=NULL.  S
2c460 6f 0a 20 20 20 20 2a 2a 20 61 20 74 65 72 6d 20  o.    ** a term 
2c470 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 79 20  of the form x=y 
2c480 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 65 20 74  does not prove t
2c490 68 61 74 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c  hat y is not nul
2c4a0 6c 20 69 66 20 78 0a 20 20 20 20 2a 2a 20 69 73  l if x.    ** is
2c4b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61   the column of a
2c4c0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
2c4d0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  /.    case TK_EQ
2c4e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
2c4f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  :.    case TK_LT
2c500 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
2c510 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
2c520 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
2c530 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
2c540 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c550 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
2c560 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c570 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
2c580 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c590 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20  >op==TK_LT );.  
2c5a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c5b0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29  xpr->op==TK_LE )
2c5c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2c5d0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c5e0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
2c5f0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c600 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
2c610 69 66 28 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  if( (pExpr->pLef
2c620 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
2c630 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 45   && IsVirtual(pE
2c640 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 54 61 62  xpr->pLeft->pTab
2c650 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 45  )).       || (pE
2c660 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d  xpr->pRight->op=
2c670 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73  =TK_COLUMN && Is
2c680 56 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70  Virtual(pExpr->p
2c690 52 69 67 68 74 2d 3e 70 54 61 62 29 29 0a 20 20  Right->pTab)).  
2c6a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 72 65      ){.       re
2c6b0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2c6c0 20 20 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61        }.    defa
2c6d0 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
2c6e0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2c6f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
2c700 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
2c710 72 6f 29 20 69 66 20 65 78 70 72 65 73 73 69 6f  ro) if expressio
2c720 6e 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  n p can only be 
2c730 74 72 75 65 20 69 66 20 61 74 20 6c 65 61 73 74  true if at least
2c740 0a 2a 2a 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  .** one column o
2c750 66 20 74 61 62 6c 65 20 69 54 61 62 20 69 73 20  f table iTab is 
2c760 6e 6f 6e 2d 6e 75 6c 6c 2e 20 20 49 6e 20 6f 74  non-null.  In ot
2c770 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
2c780 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 65 78 70  n true.** if exp
2c790 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 61  ression p will a
2c7a0 6c 77 61 79 73 20 62 65 20 4e 55 4c 4c 20 6f 72  lways be NULL or
2c7b0 20 66 61 6c 73 65 20 69 66 20 65 76 65 72 79 20   false if every 
2c7c0 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a  column of iTab.*
2c7d0 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  * is NULL..**.**
2c7e0 20 46 61 6c 73 65 20 6e 65 67 61 74 69 76 65 73   False negatives
2c7f0 20 61 72 65 20 61 63 63 65 70 74 61 62 6c 65 2e   are acceptable.
2c800 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
2c810 2c 20 69 74 20 69 73 20 6f 6b 20 74 6f 20 72 65  , it is ok to re
2c820 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 20 65 76 65  turn.** zero eve
2c830 6e 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20  n if expression 
2c840 70 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  p will never be 
2c850 74 72 75 65 20 6f 66 20 65 76 65 72 79 20 63 6f  true of every co
2c860 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20  lumn of iTab.** 
2c870 69 73 20 4e 55 4c 4c 2e 20 20 41 20 66 61 6c 73  is NULL.  A fals
2c880 65 20 6e 65 67 61 74 69 76 65 20 69 73 20 6d 65  e negative is me
2c890 72 65 6c 79 20 61 20 6d 69 73 73 65 64 20 6f 70  rely a missed op
2c8a0 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 70 70 6f 72  timization oppor
2c8b0 74 75 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 46 61  tunity..**.** Fa
2c8c0 6c 73 65 20 70 6f 73 69 74 69 76 65 73 20 61 72  lse positives ar
2c8d0 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2c 20 68  e not allowed, h
2c8e0 6f 77 65 76 65 72 2e 20 20 41 20 66 61 6c 73 65  owever.  A false
2c8f0 20 70 6f 73 69 74 69 76 65 20 6d 61 79 20 72 65   positive may re
2c900 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e  sult.** in an in
2c910 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 0a  correct answer..
2c920 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 70  **.** Terms of p
2c930 20 74 68 61 74 20 61 72 65 20 6d 61 72 6b 65 64   that are marked
2c940 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69   with EP_FromJoi
2c950 6e 20 28 61 6e 64 20 68 65 6e 63 65 20 74 68 61  n (and hence tha
2c960 74 20 63 6f 6d 65 20 66 72 6f 6d 0a 2a 2a 20 74  t come from.** t
2c970 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
2c980 6c 61 75 73 65 73 20 6f 66 20 4c 45 46 54 20 4a  lauses of LEFT J
2c990 4f 49 4e 53 29 20 61 72 65 20 65 78 63 6c 75 64  OINS) are exclud
2c9a0 65 64 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c  ed from the anal
2c9b0 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ysis..**.** This
2c9c0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
2c9d0 20 74 6f 20 63 68 65 63 6b 20 69 66 20 61 20 4c   to check if a L
2c9e0 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20  EFT JOIN can be 
2c9f0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 2a  converted into.*
2ca00 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f  * an ordinary JO
2ca10 49 4e 2e 20 20 54 68 65 20 70 20 61 72 67 75 6d  IN.  The p argum
2ca20 65 6e 74 20 69 73 20 74 68 65 20 57 48 45 52 45  ent is the WHERE
2ca30 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
2ca40 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65   WHERE.** clause
2ca50 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 73   requires that s
2ca60 6f 6d 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ome column of th
2ca70 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
2ca80 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a   the LEFT JOIN.*
2ca90 2a 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  * be non-NULL, t
2caa0 68 65 6e 20 74 68 65 20 4c 45 46 54 20 4a 4f 49  hen the LEFT JOI
2cab0 4e 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20  N can be safely 
2cac0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
2cad0 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 6a 6f  n.** ordinary jo
2cae0 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  in..*/.int sqlit
2caf0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e  e3ExprImpliesNon
2cb00 4e 75 6c 6c 52 6f 77 28 45 78 70 72 20 2a 70 2c  NullRow(Expr *p,
2cb10 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 57 61   int iTab){.  Wa
2cb20 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
2cb30 72 43 61 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c  rCallback = impl
2cb40 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20  iesNotNullRow;. 
2cb50 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2cb60 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c  ck = 0;.  w.xSel
2cb70 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30  ectCallback2 = 0
2cb80 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b  ;.  w.eCode = 0;
2cb90 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 54  .  w.u.iCur = iT
2cba0 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ab;.  sqlite3Wal
2cbb0 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
2cbc0 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
2cbd0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  }../*.** An inst
2cbe0 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2cbf0 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2cc00 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  is used by the t
2cc10 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f  ree walker.** to
2cc20 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   determine if an
2cc30 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
2cc40 62 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20  be evaluated by 
2cc50 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
2cc60 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20  .** index only, 
2cc70 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
2cc80 6f 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f  o do a search fo
2cc90 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  r the correspond
2cca0 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74  ing.** table ent
2ccb0 72 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65  ry.  The IdxCove
2ccc0 72 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20  r.pIdx field is 
2ccd0 74 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43  the index.  IdxC
2cce0 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20  over.iCur.** is 
2ccf0 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74  the cursor for t
2cd00 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72  he table..*/.str
2cd10 75 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20  uct IdxCover {. 
2cd20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
2cd30 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
2cd40 6f 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20  o be tested for 
2cd50 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e  coverage */.  in
2cd60 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f  t iCur;        /
2cd70 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
2cd80 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f  for the table co
2cd90 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
2cda0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a  he index */.};..
2cdb0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
2cdc0 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
2cdd0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
2cde0 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a  lumns in table .
2cdf0 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ** pWalker->u.pI
2ce00 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61  dxCover->iCur ca
2ce10 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75  n be satisfied u
2ce20 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a  sing the index.*
2ce30 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
2ce40 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f  xCover->pIdx..*/
2ce50 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
2ce60 49 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20  IdxCover(Walker 
2ce70 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2ce80 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
2ce90 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
2cea0 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
2ceb0 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d  iTable==pWalker-
2cec0 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43  >u.pIdxCover->iC
2ced0 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ur.   && sqlite3
2cee0 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57  ColumnOfIndex(pW
2cef0 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
2cf00 65 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d  er->pIdx, pExpr-
2cf10 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b  >iColumn)<0.  ){
2cf20 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
2cf30 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  ode = 1;.    ret
2cf40 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2cf50 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
2cf60 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
2cf70 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
2cf80 61 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e  an index pIdx on
2cf90 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
2cfa0 6f 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  or iCur contains
2cfb0 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70   will.** the exp
2cfc0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
2cfd0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
2cfe0 68 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f  he index does co
2cff0 76 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  ver the.** expre
2d000 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20  ssion and false 
2d010 69 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70  if the pExpr exp
2d020 72 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63  ression referenc
2d030 65 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  es table columns
2d040 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74  .** that are not
2d050 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e   found in the in
2d060 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
2d070 41 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e  An index coverin
2d080 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  g an expression 
2d090 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65  means that the e
2d0a0 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
2d0b0 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73  .** evaluated us
2d0c0 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64  ing only the ind
2d0d0 65 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68  ex and without h
2d0e0 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20  aving to lookup 
2d0f0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
2d100 64 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79  ding table entry
2d110 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d120 45 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64  ExprCoveredByInd
2d130 65 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ex(.  Expr *pExp
2d140 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
2d150 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73   index to be tes
2d160 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ted */.  int iCu
2d170 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
2d180 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
2d190 72 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  r for the corres
2d1a0 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f  ponding table */
2d1b0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
2d1c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
2d1d0 64 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62  dex that might b
2d1e0 65 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72  e used for cover
2d1f0 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b  age */.){.  Walk
2d200 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49  er w;.  struct I
2d210 64 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20  dxCover xcov;.  
2d220 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
2d230 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76  zeof(w));.  xcov
2d240 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  .iCur = iCur;.  
2d250 78 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78  xcov.pIdx = pIdx
2d260 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2d270 61 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76  ack = exprIdxCov
2d280 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f  er;.  w.u.pIdxCo
2d290 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73  ver = &xcov;.  s
2d2a0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2d2b0 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74  w, pExpr);.  ret
2d2c0 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a  urn !w.eCode;.}.
2d2d0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2d2e0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2d2f0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
2d300 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
2d310 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
2d320 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73  count references
2d330 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e   to table column
2d340 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  s in the argumen
2d350 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67  ts of an .** agg
2d360 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
2d370 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70   in order to imp
2d380 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71  lement the.** sq
2d390 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69  lite3FunctionThi
2d3a0 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a  sSrc() routine..
2d3b0 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75  */.struct SrcCou
2d3c0 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  nt {.  SrcList *
2d3d0 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70  pSrc;   /* One p
2d3e0 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63  articular FROM c
2d3f0 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65  lause in a neste
2d400 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
2d410 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a   nThis;       /*
2d420 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
2d430 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2d440 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a   in pSrcList */.
2d450 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20    int nOther;   
2d460 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d470 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
2d480 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46  lumns in other F
2d490 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d  ROM clauses */.}
2d4a0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ;../*.** Count t
2d4b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
2d4c0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2d4d0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
2d4e0 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57  t exprSrcCount(W
2d4f0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2d500 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2d510 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f  /* The NEVER() o
2d520 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72  n the second ter
2d530 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c  m is because sql
2d540 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
2d550 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69  ThisSrc().  ** i
2d560 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20  s always called 
2d570 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78  before sqlite3Ex
2d580 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2d590 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65  tes() and so the
2d5a0 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73  .  ** TK_COLUMNs
2d5b0 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65   have not yet be
2d5c0 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  en converted int
2d5d0 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e  o TK_AGG_COLUMN.
2d5e0 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65    If.  ** sqlite
2d5f0 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
2d600 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64  sSrc() is used d
2d610 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68  ifferently in th
2d620 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20  e future, the.  
2d630 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20  ** NEVER() will 
2d640 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76  need to be remov
2d650 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ed. */.  if( pEx
2d660 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
2d670 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72  N || NEVER(pExpr
2d680 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
2d690 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  UMN) ){.    int 
2d6a0 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  i;.    struct Sr
2d6b0 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c  cCount *p = pWal
2d6c0 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74  ker->u.pSrcCount
2d6d0 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  ;.    SrcList *p
2d6e0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
2d6f0 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53     int nSrc = pS
2d700 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20  rc ? pSrc->nSrc 
2d710 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  : 0;.    for(i=0
2d720 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  ; i<nSrc; i++){.
2d730 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2d740 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
2d750 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72  [i].iCursor ) br
2d760 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
2d770 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20  f( i<nSrc ){.   
2d780 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20     p->nThis++;. 
2d790 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d7a0 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20  p->nOther++;.   
2d7b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2d7c0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2d7d0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
2d7e0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61   if any of the a
2d7f0 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
2d800 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72  pExpr Function r
2d810 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63  eference.** pSrc
2d820 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72  List.  Return tr
2d830 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20  ue if they do.  
2d840 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65  Also return true
2d850 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
2d860 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d  .** has no argum
2d870 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79  ents or has only
2d880 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
2d890 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  nts.  Return fal
2d8a0 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72  se if pExpr.** r
2d8b0 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e  eferences column
2d8c0 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e  s but not column
2d8d0 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e  s of tables foun
2d8e0 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a  d in pSrcList..*
2d8f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e  /.int sqlite3Fun
2d900 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
2d910 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72  (Expr *pExpr, Sr
2d920 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29  cList *pSrcList)
2d930 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2d940 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
2d950 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  cnt;.  assert( p
2d960 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
2d970 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77  _FUNCTION );.  w
2d980 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2d990 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20   exprSrcCount;. 
2d9a0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2d9b0 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53  ck = 0;.  w.u.pS
2d9c0 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a  rcCount = &cnt;.
2d9d0 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72    cnt.pSrc = pSr
2d9e0 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68  cList;.  cnt.nTh
2d9f0 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f  is = 0;.  cnt.nO
2da00 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ther = 0;.  sqli
2da10 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28  te3WalkExprList(
2da20 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  &w, pExpr->x.pLi
2da30 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e  st);.  return cn
2da40 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74  t.nThis>0 || cnt
2da50 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f  .nOther==0;.}../
2da60 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
2da70 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
2da80 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61  ggInfo->aCol[] a
2da90 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
2daa0 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
2dab0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
2dac0 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
2dad0 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
2dae0 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
2daf0 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
2db00 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33  foColumn(sqlite3
2db10 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
2db20 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
2db30 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20    pInfo->aCol = 
2db40 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
2db50 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
2db60 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
2db70 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  Col,.       size
2db80 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30  of(pInfo->aCol[0
2db90 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
2dba0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  o->nColumn,.    
2dbb0 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
2dbc0 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
2dbd0 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
2dbe0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
2dbf0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61  gInfo->aFunc[] a
2dc00 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
2dc10 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
2dc20 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
2dc30 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
2dc40 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
2dc50 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
2dc60 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
2dc70 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a  foFunc(sqlite3 *
2dc80 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
2dc90 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
2dca0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73  pInfo->aFunc = s
2dcb0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
2dcc0 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20  ate(.       db, 
2dcd0 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
2dce0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a  Func,.       siz
2dcf0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  eof(pInfo->aFunc
2dd00 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
2dd10 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20  nfo->nFunc,.    
2dd20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
2dd30 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
2dd40 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
2dd50 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f  xExprCallback fo
2dd60 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e  r a tree walker.
2dd70 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a    It is used to.
2dd80 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c  ** implement sql
2dd90 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2dda0 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65  ggregates().  Se
2ddb0 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
2ddc0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a  lyzeAggregates.*
2ddd0 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
2dde0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
2ddf0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
2de00 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c  yzeAggregate(Wal
2de10 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2de20 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
2de30 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
2de40 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65  xt *pNC = pWalke
2de50 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73  r->u.pNC;.  Pars
2de60 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  e *pParse = pNC-
2de70 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69  >pParse;.  SrcLi
2de80 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
2de90 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
2dea0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2deb0 6f 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67  o = pNC->uNC.pAg
2dec0 67 49 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74  gInfo;..  assert
2ded0 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26  ( pNC->ncFlags &
2dee0 20 4e 43 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a   NC_UAggInfo );.
2def0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
2df00 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
2df10 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
2df20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
2df30 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
2df40 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2df50 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
2df60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2df70 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
2df80 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f  OLUMN );.      /
2df90 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2dfa0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
2dfb0 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
2dfc0 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
2dfd0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
2dfe0 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
2dff0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
2e000 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
2e010 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
2e020 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2e030 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2e040 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20   pSrcList->a;.  
2e050 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2e060 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
2e070 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
2e080 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2e090 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
2e0a0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ol;.          as
2e0b0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2e0c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2e0d0 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2e0e0 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
2e0f0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2e100 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
2e110 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
2e120 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
2e130 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
2e140 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45  it means that pE
2e150 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20  xpr refers to a 
2e160 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
2e170 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20    ** that is in 
2e180 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2e190 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
2e1a0 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20   query.  .      
2e1b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2e1c0 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20       ** Make an 
2e1d0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f  entry for the co
2e1e0 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f  lumn in pAggInfo
2e1f0 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72  ->aCol[] if ther
2e200 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
2e210 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79   is not an entry
2e220 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
2e230 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2e240 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
2e250 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
2e260 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ol = pAggInfo->a
2e270 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
2e280 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67   for(k=0; k<pAgg
2e290 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  Info->nColumn; k
2e2a0 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
2e2b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2e2c0 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  Col->iTable==pEx
2e2d0 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
2e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2f0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  pCol->iColumn==p
2e300 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
2e310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e320 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2e330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e350 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e    if( (k>=pAggIn
2e360 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20  fo->nColumn).   
2e370 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20            && (k 
2e380 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  = addAggInfoColu
2e390 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  mn(pParse->db, p
2e3a0 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20  AggInfo))>=0 .  
2e3b0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2e3c0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
2e3d0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
2e3e0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[k];.          
2e3f0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d      pCol->pTab =
2e400 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
2e410 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2e420 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
2e430 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
2e440 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
2e450 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
2e460 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
2e470 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d        pCol->iMem
2e480 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2e490 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
2e4a0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2e4b0 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
2e4c0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
2e4d0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
2e4e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e4f0 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
2e500 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
2e510 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a        int j, n;.
2e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e530 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20  ExprList *pGB = 
2e540 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
2e550 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  By;.            
2e560 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2e570 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20  ist_item *pTerm 
2e580 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20  = pGB->a;.      
2e590 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47            n = pG
2e5a0 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  B->nExpr;.      
2e5b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2e5c0 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65  0; j<n; j++, pTe
2e5d0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
2e5e0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
2e5f0 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
2e600 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e610 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
2e620 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d  TK_COLUMN && pE-
2e630 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
2e640 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
2e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e660 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pE->iColumn==pEx
2e670 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
2e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e690 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
2e6a0 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2e6d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e6e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e6f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e700 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2e710 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2e720 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
2e730 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
2e740 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41  orterColumn = pA
2e750 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67  ggInfo->nSorting
2e760 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
2e770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e790 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
2e7a0 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  now an entry for
2e7b0 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e   pExpr in pAggIn
2e7c0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68  fo->aCol[] (eith
2e7d0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
2e7e0 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  * because it was
2e7f0 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72   there before or
2e800 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
2e810 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20   created it)..  
2e820 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e            ** Con
2e830 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74  vert the pExpr t
2e840 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f  o be a TK_AGG_CO
2e850 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74  LUMN referring t
2e860 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  o that.         
2e870 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e     ** pAggInfo->
2e880 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20  aCol[] entry..  
2e890 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2e8a0 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
2e8b0 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
2e8c0 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
2e8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
2e8e0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
2e8f0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
2e900 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
2e910 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
2e920 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2e930 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b  r->iAgg = (i16)k
2e940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
2e950 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2e960 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d   /* endif pExpr-
2e970 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
2e980 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20  iCursor */.     
2e990 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70     } /* end loop
2e9a0 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a   over pSrcList *
2e9b0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
2e9c0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2e9d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2e9e0 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
2e9f0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  : {.      if( (p
2ea00 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
2ea10 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20  _InAggFunc)==0. 
2ea20 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72        && pWalker
2ea30 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70  ->walkerDepth==p
2ea40 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20  Expr->op2.      
2ea50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
2ea60 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
2ea70 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
2ea80 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
2ea90 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
2eaa0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
2eab0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
2eac0 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
2ead0 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
2eae0 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
2eaf0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2eb00 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
2eb10 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
2eb20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
2eb30 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
2eb40 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2eb50 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2eb60 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70  ExprCompare(0, p
2eb70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
2eb80 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  pr, -1)==0 ){.  
2eb90 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2eba0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ebb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2ebc0 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
2ebd0 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
2ebe0 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
2ebf0 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
2ec00 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
2ec10 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
2ec20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2ec30 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
2ec40 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
2ec50 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
2ec60 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
2ec70 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
2ec80 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
2ec90 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
2eca0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2ecb0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2ecc0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2ecd0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
2ece0 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
2ecf0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
2ed00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2ed10 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
2ed20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
2ed30 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  Item->iMem = ++p
2ed40 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2ed50 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2ed60 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2ed70 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
2ed80 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
2ed90 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
2eda0 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
2edb0 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
2edc0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
2edd0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
2ede0 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20  zToken, .       
2edf0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2ee00 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78  r->x.pList ? pEx
2ee10 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2ee20 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
2ee30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ee40 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
2ee50 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
2ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
2ee70 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
2ee80 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2ee90 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
2eea0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
2eeb0 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
2eec0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
2eed0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2eee0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2eef0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
2ef00 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
2ef10 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
2ef20 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
2ef30 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
2ef40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2ef50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2ef60 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
2ef70 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
2ef80 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65  ;.        ExprSe
2ef90 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
2efa0 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
2efb0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
2efc0 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a  >iAgg = (i16)i;.
2efd0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
2efe0 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
2eff0 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
2f000 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2f010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f020 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
2f030 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
2f040 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2f050 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2f060 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  .}.static int an
2f070 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
2f080 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a  nSelect(Walker *
2f090 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2f0a0 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55  *pSelect){.  UNU
2f0b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
2f0c0 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65  elect);.  pWalke
2f0d0 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b  r->walkerDepth++
2f0e0 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
2f0f0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
2f100 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67  c void analyzeAg
2f110 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
2f120 45 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  End(Walker *pWal
2f130 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
2f140 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  lect){.  UNUSED_
2f150 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63  PARAMETER(pSelec
2f160 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77  t);.  pWalker->w
2f170 61 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a  alkerDepth--;.}.
2f180 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
2f190 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73  he pExpr express
2f1a0 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ion looking for 
2f1b0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2f1c0 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76  ons and.** for v
2f1d0 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65  ariables that ne
2f1e0 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ed to be added t
2f1f0 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  o AggInfo object
2f200 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49   that pNC->pAggI
2f210 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  nfo.** points to
2f220 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e  .  Additional en
2f230 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f  tries are made o
2f240 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62  n the AggInfo ob
2f250 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73  ject as.** neces
2f260 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
2f270 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2f280 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
2f290 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
2f2a0 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
2f2b0 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
2f2c0 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
2f2d0 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mes()..*/.void s
2f2e0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2f2f0 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
2f300 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
2f310 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61  pr *pExpr){.  Wa
2f320 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
2f330 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  rCallback = anal
2f340 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20  yzeAggregate;.  
2f350 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2f360 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
2f370 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20  gatesInSelect;. 
2f380 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2f390 63 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ck2 = analyzeAgg
2f3a0 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45  regatesInSelectE
2f3b0 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65  nd;.  w.walkerDe
2f3c0 70 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70  pth = 0;.  w.u.p
2f3d0 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65  NC = pNC;.  asse
2f3e0 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  rt( pNC->pSrcLis
2f3f0 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  t!=0 );.  sqlite
2f400 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
2f410 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  xpr);.}../*.** C
2f420 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41  all sqlite3ExprA
2f430 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2f440 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
2f450 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a  ression in an.**
2f460 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
2f470 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
2f480 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
2f490 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2f4a0 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20  r is found, the 
2f4b0 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20  analysis is cut 
2f4c0 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  short..*/.void s
2f4d0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2f4e0 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e  eAggList(NameCon
2f4f0 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c  text *pNC, ExprL
2f500 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
2f510 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2f520 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
2f530 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
2f540 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
2f550 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
2f560 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
2f570 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
2f580 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f590 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2f5a0 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70  es(pNC, pItem->p
2f5b0 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
2f5c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2f5d0 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  te a single new 
2f5e0 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73 65  register for use
2f5f0 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e   to hold some in
2f600 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
2f610 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2f620 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73  3GetTempReg(Pars
2f630 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
2f640 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
2f650 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  eg==0 ){.    ret
2f660 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  urn ++pParse->nM
2f670 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  em;.  }.  return
2f680 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2f690 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d  g[--pParse->nTem
2f6a0 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pReg];.}../*.** 
2f6b0 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67  Deallocate a reg
2f6c0 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76  ister, making av
2f6d0 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73  ailable for reus
2f6e0 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
2f6f0 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a  .** purpose..**.
2f700 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
2f710 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65   is currently be
2f720 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 65 20  ing used by the 
2f730 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68  column cache, th
2f740 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c 6f  en.** the deallo
2f750 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72  cation is deferr
2f760 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c  ed until the col
2f770 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74  umn cache line t
2f780 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20  hat uses.** the 
2f790 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73  register becomes
2f7a0 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   stale..*/.void 
2f7b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2f7c0 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
2f7d0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
2f7e0 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50    if( iReg && pP
2f7f0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
2f800 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
2f810 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
2f820 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
2f830 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
2f840 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
2f850 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
2f860 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
2f870 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
2f880 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
2f890 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
2f8a0 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65         p->tempRe
2f8b0 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  g = 1;.        r
2f8c0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
2f8d0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
2f8e0 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
2f8f0 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
2f900 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
2f910 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64  ** Allocate or d
2f920 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63  eallocate a bloc
2f930 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63  k of nReg consec
2f940 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73 2e  utive registers.
2f950 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
2f960 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  etTempRange(Pars
2f970 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
2f980 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  Reg){.  int i, n
2f990 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20  ;.  if( nReg==1 
2f9a0 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  ) return sqlite3
2f9b0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
2f9c0 65 29 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65  e);.  i = pParse
2f9d0 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
2f9e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
2f9f0 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
2fa00 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=n ){.    asser
2fa10 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e  t( !usedAsColumn
2fa20 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c  Cache(pParse, i,
2fa30 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70   i+n-1) );.    p
2fa40 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2fa50 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
2fa60 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2fa70 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
2fa80 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
2fa90 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
2faa0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
2fab0 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
2fac0 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
2fad0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2fae0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2faf0 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
2fb00 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65  nReg){.  if( nRe
2fb10 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  g==1 ){.    sqli
2fb20 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
2fb30 67 28 70 50 61 72 73 65 2c 20 69 52 65 67 29 3b  g(pParse, iReg);
2fb40 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2fb50 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2fb60 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
2fb70 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20  , iReg, nReg);. 
2fb80 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65   if( nReg>pParse
2fb90 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20  ->nRangeReg ){. 
2fba0 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
2fbb0 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20  eReg = nReg;.   
2fbc0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2fbd0 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  eg = iReg;.  }.}
2fbe0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c  ../*.** Mark all
2fbf0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
2fc00 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e  ters as being un
2fc10 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
2fc20 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  use..*/.void sql
2fc30 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
2fc40 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
2fc50 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
2fc60 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  nTempReg = 0;.  
2fc70 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2fc80 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g = 0;.}../*.** 
2fc90 56 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e 6f  Validate that no
2fca0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
2fcb0 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69 6e  ter falls within
2fcc0 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a   the range of.**
2fcd0 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20   iFirst..iLast, 
2fce0 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69 73  inclusive.  This
2fcf0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
2fd00 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69   call from withi
2fd10 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74  n assert().** st
2fd20 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66  atements..*/.#if
2fd30 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2fd40 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54 65  .int sqlite3NoTe
2fd50 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73 65  mpsInRange(Parse
2fd60 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
2fd70 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74 29  irst, int iLast)
2fd80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
2fd90 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2fda0 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72 73  eg>0.   && pPars
2fdb0 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50 61  e->iRangeReg+pPa
2fdc0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3e  rse->nRangeReg >
2fdd0 20 69 46 69 72 73 74 0a 20 20 20 26 26 20 70 50   iFirst.   && pP
2fde0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2fdf0 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a 20 20  <= iLast.  ){.  
2fe00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2fe10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
2fe20 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20  arse->nTempReg; 
2fe30 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
2fe40 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
2fe50 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50 61  ]>=iFirst && pPa
2fe60 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d  rse->aTempReg[i]
2fe70 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  <=iLast ){.     
2fe80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
2fe90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
2fea0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2feb0 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a           ITE_DEBUG */.