/ Hex Artifact Content
Login

Artifact ee29e9c2af181dd8fe4476f7e983aa13aa1634d00dd955a90ffbeb4732d7bc39:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
0fd0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
0fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
0ff0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1000: 29 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  ) works the same
1010: 20 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72   exact that it r
1020: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65  eturns the.** de
1030: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1040: 69 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20  if pExpr has no 
1050: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
1060: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  n..**.** The col
1070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1080: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
1090: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
10a0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
10b0: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
10c0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
10d0: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
10f0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
1100: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
1110: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
1120: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
1130: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
1140: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
1150: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1160: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1180: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1190: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
11b0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
11c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
11d0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
11e0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
11f0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >op;.    if( p->
1200: 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72  flags & EP_Gener
1210: 69 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ic ) break;.    
1220: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
1230: 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  || op==TK_UPLUS 
1240: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  ){.      p = p->
1250: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e  pLeft;.      con
1260: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1270: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   if( op==TK_COLL
1280: 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52  ATE || (op==TK_R
1290: 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 6f 70  EGISTER && p->op
12a0: 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 29 20 29  2==TK_COLLATE) )
12b0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
12c0: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
12d0: 71 28 70 50 61 72 73 65 2c 20 45 4e 43 28 64 62  q(pParse, ENC(db
12e0: 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  ), 0, p->u.zToke
12f0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1310: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1320: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1330: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  MN.          || 
1340: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1350: 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45  || op==TK_TRIGGE
1360: 52 29 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 54  R).     && p->pT
1370: 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ab!=0.    ){.   
1380: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
1390: 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62  ISTER && p->pTab
13a0: 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e  !=0 happens when
13b0: 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69   pExpr was origi
13c0: 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61  nally.      ** a
13d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77   TK_COLUMN but w
13e0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76  as previously ev
13f0: 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68  aluated and cach
1400: 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
1410: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 20   */.      int j 
1420: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
1430: 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a      if( j>=0 ){.
1440: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1450: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70  ar *zColl = p->p
1460: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
1470: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  ll;.        pCol
1480: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
1490: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
14a0: 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
14b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14d0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
14e0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
14f0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
1500: 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67   (p->pLeft->flag
1510: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
1520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20  =0 ){.        p 
1530: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1550: 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20 3d 20   Expr *pNext  = 
1560: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1570: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
1580: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
1590: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
15a0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
15b0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
15c0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
15d0: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
15e0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
15f0: 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68 6f 6c   /* p->flags hol
1600: 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20 61 6e  ds EP_Collate an
1610: 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  d p->pLeft->flag
1620: 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41 6e 64  s does not.  And
1630: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 78  .        ** p->x
1640: 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f 74 2e  .pSelect cannot.
1650: 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70 4c 65    So if p->x.pLe
1660: 66 74 20 65 78 69 73 74 73 2c 20 69 74 20 6d 75  ft exists, it mu
1670: 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20 20 20  st hold at.     
1680: 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20     ** least one 
1690: 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68 75 73  EP_Collate. Thus
16a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
16b0: 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a 20 20  wo ALWAYS. */.  
16c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 2e 70        if( p->x.p
16d0: 4c 69 73 74 21 3d 30 20 26 26 20 41 4c 57 41 59  List!=0 && ALWAY
16e0: 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  S(!ExprHasProper
16f0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
1700: 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ct)) ){.        
1710: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
1730: 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  YS(i<p->x.pList-
1740: 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20  >nExpr); i++){. 
1750: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45             if( E
1760: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1770: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1780: 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74  pExpr, EP_Collat
1790: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
17a0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78      pNext = p->x
17b0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
17c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1800: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
1810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1820: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
1830: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1840: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
1850: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
1860: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
1870: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1880: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
1890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
18a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18b0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
18c0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
18d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
18e0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
18f0: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
1900: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1910: 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c 6c  .** defautl coll
1920: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
1930: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1950: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
1960: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1970: 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  q() routine work
1980: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
1990: 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65 74  t that it.** ret
19a0: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19b0: 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64  re is no defined
19c0: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 43   collation..*/.C
19d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
19e0: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61 72  xprNNCollSeq(Par
19f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a00: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
1a10: 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Seq *p = sqlite3
1a20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1a30: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  se, pExpr);.  if
1a40: 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50 61  ( p==0 ) p = pPa
1a50: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1a60: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  ll;.  assert( p!
1a70: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a90: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74 77  n TRUE if the tw
1aa0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68 61  o expressions ha
1ab0: 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  ve equivalent co
1ac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ad0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1ae0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63  3ExprCollSeqMatc
1af0: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1b00: 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
1b10: 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53 65   *pE2){.  CollSe
1b20: 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c 69  q *pColl1 = sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a 20  (pParse, pE1);. 
1b50: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
1b60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
1b70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b80: 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  pE2);.  return s
1b90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ba0: 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f  oll1->zName, pCo
1bb0: 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b 0a  ll2->zName)==0;.
1bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1bd0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
1be0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1bf0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1c00: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1c10: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1c20: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1c30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c40: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1c50: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1c60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1c70: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1c80: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
1c90: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1ca0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
1cb0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
1cc0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
1cd0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1ce0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1cf0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1d00: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1d10: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1d20: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1d30: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1d40: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1d50: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1d60: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1d70: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1d80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d90: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1da0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
1db0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1dc0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
1dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1de0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1e00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1e10: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1e20: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1e30: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1e40: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1e50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e60: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1e70: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1e80: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1eb0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ec0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ed0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1ee0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1ef0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1f00: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1f10: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1f20: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1f30: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1f40: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1f50: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1f60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1f70: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1f80: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1f90: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1fa0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1fb0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1fc0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1fd0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1fe0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1ff0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2000: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2010: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2020: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2030: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2040: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2050: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2060: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2070: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
2080: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
2090: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
20a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
20b0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
20c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
20d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
20e0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
20f0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2100: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2110: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2120: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2130: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2140: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2150: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2160: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2170: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
2180: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
2190: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
21b0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
21c0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
21f0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2200: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2210: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2220: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2230: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2240: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2250: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2260: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2270: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
2280: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
2290: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
22a0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
22b0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
22c0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
22d0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
22e0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
22f0: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2300: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2310: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2320: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2330: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2340: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2350: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2360: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2370: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
2380: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
2390: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
23a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23b0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
23c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
23d0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
23e0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
23f0: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2400: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2410: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2420: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2430: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2440: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2460: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2470: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2480: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
2490: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
24a0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
24b0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
24c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
24d0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
24e0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
24f0: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2500: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2510: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2520: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2530: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2540: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2550: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2560: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2570: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2580: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
2590: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
25a0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
25b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25c0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
25d0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
25e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
25f0: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2600: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2610: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2620: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2630: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2640: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2650: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2660: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2670: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2680: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
2690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
26a0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
26b0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
26c0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
26d0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
26e0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
26f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2700: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2710: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2720: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2730: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2740: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2750: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2760: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2770: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2780: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
2790: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
27a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27b0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
27c0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
27d0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
27e0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
27f0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2800: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2810: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2820: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2830: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2840: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2850: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2860: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2870: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2880: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
2890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
28b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
28c0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
28d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
28e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
28f0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2900: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2910: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2920: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2940: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2950: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2960: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2970: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2980: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
2990: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
29a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
29b0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
29c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
29d0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
29e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
29f0: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2a00: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2a10: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2a20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2a30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2a40: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2a50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2a70: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2a80: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
2a90: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
2aa0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
2ab0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
2ac0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
2ad0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
2ae0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2af0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2b00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2b10: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2b20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2b30: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2b40: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2b50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2b60: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2b70: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2b80: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
2b90: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
2ba0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2bb0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
2bc0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
2bd0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2c00: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2c10: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2c20: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2c30: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2c40: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2c60: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2c70: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2c80: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
2c90: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
2ca0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
2cb0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
2cc0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
2cd0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
2ce0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2cf0: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2d00: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2d10: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2d20: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2d30: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2d40: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2d50: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2d60: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2d70: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2d80: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
2d90: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
2da0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
2db0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
2dc0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
2dd0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
2de0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2e00: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2e20: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2e30: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2e60: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2e70: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2e80: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2e90: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ea0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2eb0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ec0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ed0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2ee0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2ef0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2f00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2f10: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2f20: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2f30: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2f40: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2f50: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2f60: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2f70: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2f80: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2fb0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2fc0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2fd0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2fe0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2ff0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
3000: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
3010: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
3020: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
3030: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
3040: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
3050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3060: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
3070: 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70  bexpression of p
3080: 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74  Vector that is t
3090: 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d  he i-th.** colum
30a0: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
30b0: 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69  (numbered starti
30c0: 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65  ng with 0).  The
30d0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
30e0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73  ensure that i is
30f0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a   within range..*
3100: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3110: 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c  is really a scal
3120: 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22  ar (and "scalar"
3130: 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73   here includes s
3140: 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61  ubqueries.** tha
3150: 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  t return a singl
3160: 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20  e column!) then 
3170: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75  return pVector u
3180: 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  nmodified..**.**
3190: 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73   pVector retains
31a0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
31b0: 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65 78  e returned subex
31c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
31d0: 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69 73  If the vector is
31e0: 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20   a (SELECT ...) 
31f0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
3200: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a  ion returned is.
3210: 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70 72  ** just the expr
3220: 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  ession for the i
3230: 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
3240: 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
3250: 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65  may.** not be re
3260: 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ady for evaluati
3270: 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74  on because the t
3280: 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20  able cursor has 
3290: 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
32a0: 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45  positioned..*/.E
32b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74  xpr *sqlite3Vect
32c0: 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45  orFieldSubexpr(E
32d0: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e  xpr *pVector, in
32e0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
32f0: 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  i<sqlite3ExprVec
3300: 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29  torSize(pVector)
3310: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
3320: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56  3ExprIsVector(pV
3330: 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73  ector) ){.    as
3340: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f  sert( pVector->o
3350: 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72  p2==0 || pVector
3360: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
3370: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65  R );.    if( pVe
3380: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3390: 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e  ECT || pVector->
33a0: 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  op2==TK_SELECT )
33b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
33c0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
33d0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
33e0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
33f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3400: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3410: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3430: 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  pVector;.}../*.*
3440: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
3450: 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20  turn a new Expr 
3460: 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65  object which whe
3470: 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73  n passed to.** s
3480: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
3490: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61   will generate a
34a0: 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64  ll necessary cod
34b0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  e to compute.** 
34c0: 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f  the iField-th co
34d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
34e0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56  or expression pV
34f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ector..**.** It 
3500: 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f  is ok for pVecto
3510: 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  r to be a scalar
3520: 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69   (as long as iFi
3530: 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e  eld==0).  .** In
3540: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
3550: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
3560: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44  ike sqlite3ExprD
3570: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  up()..**.** The 
3580: 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20  caller owns the 
3590: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
35a0: 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70  ject and is resp
35b0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65  onsible for.** e
35c0: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
35d0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
35e0: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
35f0: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  freed..**.** The
3600: 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20   caller retains 
3610: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65  ownership of pVe
3620: 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f  ctor.  If pVecto
3630: 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54  r is a TK_SELECT
3640: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
3650: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77 69  turned object wi
3660: 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65  ll reference pVe
3670: 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63  ctor and so pVec
3680: 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a  tor must remain.
3690: 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ** valid for the
36a0: 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74   life of the ret
36b0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49  urned object.  I
36c0: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
36d0: 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61  K_VECTOR.** or a
36e0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
36f0: 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20  on, then it can 
3700: 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
3710: 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  on as this routi
3720: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a  ne.** returns..*
3730: 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20  *.** A trick to 
3740: 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43  cause a TK_SELEC
3750: 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20  T pVector to be 
3760: 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72  deleted together
3770: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74   with.** the ret
3780: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3790: 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74  t is to attach t
37a0: 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68  he pVector to th
37b0: 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a  e pRight field.*
37c0: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
37d0: 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  d TK_SELECT_COLU
37e0: 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a  MN Expr object..
37f0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3800: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
3810: 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ld(.  Parse *pPa
3820: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3830: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3840: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3850: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
3860: 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20  ector.  List of 
3870: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61  expressions or a
3880: 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20   sub-SELECT */. 
3890: 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20   int iField     
38a0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
38b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
38c0: 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  tor to return */
38d0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74  .){.  Expr *pRet
38e0: 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d  ;.  if( pVector-
38f0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
3910: 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45  ector->flags & E
3920: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20  P_xIsSelect );. 
3930: 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c     /* The TK_SEL
3940: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3950: 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  node:.    **.   
3960: 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20   ** pLeft:      
3970: 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e       pVector con
3980: 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43  taining TK_SELEC
3990: 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e  T.  Not deleted.
39a0: 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20  .    ** pRight: 
39b0: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65           not use
39c0: 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76  d.  But recursiv
39d0: 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  ely deleted..   
39e0: 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20   ** iColumn:    
39f0: 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20       Index of a 
3a00: 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f  column in pVecto
3a10: 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a  r.    ** iTable:
3a20: 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20 74            0 or t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
3a40: 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53 20  umns on the LHS 
3a50: 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74  of an assignment
3a60: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3a70: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3a80: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3a90: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3aa0: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3ab0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3ac0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
3ad0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
3ae0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
3af0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
3b00: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
3b10: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3b20: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3b30: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3b40: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3b50: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3b60: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3b70: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3b80: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3b90: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3ba0: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3bb0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
3bc0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
3bd0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
3be0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
3bf0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
3c00: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3c10: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3c20: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3c30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3c40: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3c50: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3c60: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3c70: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3c80: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3c90: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3ca0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3cb0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
3cc0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Ret ){.      pRe
3cd0: 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69  t->iColumn = iFi
3ce0: 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  eld;.      pRet-
3cf0: 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72  >pLeft = pVector
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3d10: 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70  rt( pRet==0 || p
3d20: 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  Ret->iTable==0 )
3d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
3d50: 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63  TK_VECTOR ) pVec
3d60: 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  tor = pVector->x
3d70: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
3d80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65  ].pExpr;.    pRe
3d90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3da0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
3db0: 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a  Vector, 0);.  }.
3dc0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
3de0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f  ssion pExpr is o
3df0: 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54  f type TK_SELECT
3e00: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
3e10: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69  to evaluate.** i
3e20: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  t. Return the re
3e30: 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20  gister in which 
3e40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
3e50: 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65  ored (or, if the
3e60: 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
3e70: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3e80: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  n one column, th
3e90: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3ea0: 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74  ray.** of regist
3eb0: 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65  ers in which the
3ec0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3ed0: 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  d)..**.** If pEx
3ee0: 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53  pr is not a TK_S
3ef0: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3f00: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
3f10: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
3f20: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
3f30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3f40: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
3f50: 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  eg = 0;.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3f70: 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
3f80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3f90: 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c  ){.    reg = sql
3fa0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
3fb0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
3fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
3fd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
3fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
3ff0: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
4000: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
4010: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4020: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4030: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4040: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4050: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4060: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4070: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4080: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
4090: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
40a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
40b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
40c0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
40d0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
40e0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
40f0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
4100: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
4110: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4120: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4130: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4140: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4150: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4160: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4170: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4180: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
4190: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
41a0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
41b0: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
41c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
41d0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
41e0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
41f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
4200: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
4210: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4220: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4230: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4240: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4250: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4260: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4270: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4280: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
4290: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
42a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
42b0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
42c0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
42d0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
42e0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
42f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4300: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
4310: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4320: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4330: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4340: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4350: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
4390: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
43a0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
43b0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
43c0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
43d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
43e0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
4410: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4420: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4450: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4460: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4470: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4480: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
4490: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
44a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
44b0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
44c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
44d0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
44e0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
44f0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
4500: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4510: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4520: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4530: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4540: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4550: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4560: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4570: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4580: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
45a0: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
45b0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
45c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
45d0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
45e0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
45f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
4600: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
4610: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4620: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4630: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4640: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4650: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4660: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4670: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4680: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
4690: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
46a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
46b0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
46c0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
46d0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
46e0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
46f0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4700: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
4710: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4720: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4730: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4740: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4750: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4770: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4780: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
4790: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
47a0: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
47b0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
47c0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
47d0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
47e0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
47f0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
4800: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4820: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4830: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4840: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4850: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4860: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4870: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4880: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4890: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
48a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
48b0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
48c0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
48d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
48e0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
48f0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4900: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
4910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4920: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4930: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4950: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4960: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4970: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4980: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4990: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
49a0: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
49b0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
49c0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
49d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
49e0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
49f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4a00: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4a10: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4a20: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4a30: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4a50: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  abel(v);..  if( 
4a60: 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45 78  nLeft!=sqlite3Ex
4a70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69  prVectorSize(pRi
4a80: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
4a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4aa0: 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
4ab0: 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72 65  isused");.    re
4ac0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ad0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4ae0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
4af0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
4b20: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20  p==TK_ISNOT .   
4b30: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72  ==TK_LT || pExpr
4b50: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20  ->op==TK_GT .   
4b60: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b70: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72  ==TK_LE || pExpr
4b80: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29  ->op==TK_GE .  )
4b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
4ba0: 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45  r->op==op || (pE
4bb0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26  xpr->op==TK_IS &
4bc0: 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20  & op==TK_EQ).   
4bd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78           || (pEx
4be0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4bf0: 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29   && op==TK_NE) )
4c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c10: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d  0 || pExpr->op!=
4c20: 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  op );.  assert( 
4c30: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4c40: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
4c50: 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53  op );..  p5 |= S
4c60: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20  QLITE_STOREP2;. 
4c70: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20   if( opx==TK_LE 
4c80: 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20  ) opx = TK_LT;. 
4c90: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20   if( opx==TK_GE 
4ca0: 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a  ) opx = TK_GT;..
4cb0: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4cc0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4cd0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4ce0: 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43  regRight = exprC
4cf0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
4d00: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20  rse, pRight);.. 
4d10: 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f   for(i=0; 1 /*Lo
4d20: 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65  op exits by "bre
4d30: 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20  ak"*/; i++){.   
4d40: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
4d50: 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  0, regFree2 = 0;
4d60: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a  .    Expr *pL, *
4d70: 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c  pR; .    int r1,
4d80: 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28   r2;.    assert(
4d90: 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74   i>=0 && i<nLeft
4da0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20   );.    if( i>0 
4db0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  ) sqlite3ExprCac
4dc0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
4dd0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4de0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4df0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4e00: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e10: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e20: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e30: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e40: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e50: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e60: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e70: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e80: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e90: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4ea0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4eb0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4ec0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ed0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ee0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ef0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f00: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f10: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f20: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f30: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f40: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f50: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f60: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f70: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f80: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f90: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4fa0: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fb0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fc0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fd0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fe0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4ff0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5000: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5010: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5020: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5030: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5040: 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70  i>0 ) sqlite3Exp
5050: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
5060: 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c  );.    if( i==nL
5070: 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62  eft-1 ){.      b
5080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5090: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29  if( opx==TK_EQ )
50a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
50b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
50c0: 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64  IfNot, dest, add
50d0: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
50e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
50f0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
5100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
5110: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29  if( opx==TK_NE )
5120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5140: 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f  If, dest, addrDo
5150: 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ne); VdbeCoverag
5160: 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c  e(v);.      p5 |
5170: 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  = SQLITE_KEEPNUL
5180: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
5190: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
51a0: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  TK_LT || op==TK_
51b0: 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20  GT || op==TK_LE 
51c0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  || op==TK_GE );.
51d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c  eAddOp2(v, OP_El
51f0: 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72  seNotEq, 0, addr
5200: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Done);.      Vdb
5210: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
5220: 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20  p==TK_LT);.     
5230: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
5240: 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20  v, op==TK_GT);. 
5250: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5260: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45  eIf(v, op==TK_LE
5270: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5280: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
5290: 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28  K_GE);.      if(
52a0: 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70   i==nLeft-2 ) op
52b0: 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  x = op;.    }.  
52c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
52d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
52e0: 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66  ddrDone);.}..#if
52f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
5300: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
5310: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
5320: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
5330: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
5340: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
5350: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
5360: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
5370: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
5380: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5390: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
53a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
53b0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
53c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
53d0: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
53e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
53f0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
5400: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
5410: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5420: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
5430: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
5440: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
5450: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5460: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
5470: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
5480: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
5490: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
54a0: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
54b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
54c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
54d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
54e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
54f0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
5500: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
5510: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
5520: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
5530: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
5540: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
5550: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
5560: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
5570: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5580: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
5590: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
55a0: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
55b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
55c0: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
55d0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
55e0: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
55f0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
5600: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
5610: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
5620: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
5630: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
5640: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
5650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5660: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
5670: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5680: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5690: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
56a0: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
56b0: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
56c0: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
56d0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
56e0: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
56f0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
5700: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5710: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5720: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5730: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
5740: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
5750: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
5760: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
5770: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
5780: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5790: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
57a0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20  t *pSelect, int 
57b0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65  *pnHeight){.  Se
57c0: 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70  lect *p;.  for(p
57d0: 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70  =pSelect; p; p=p
57e0: 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68  ->pPrior){.    h
57f0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5800: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
5810: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5820: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
5830: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5840: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5850: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
5860: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5870: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
5880: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5890: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
58a0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
58b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
58c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
58d0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
58e0: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
58f0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
5900: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
5910: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
5920: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
5930: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
5940: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
5950: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
5960: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
5970: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
5980: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
5990: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
59a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
59b0: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
59c0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
59d0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
59e0: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
59f0: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
5a00: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
5a10: 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67  pagate EP_Propag
5a20: 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f  ate flags up fro
5a30: 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74  m Expr.x.pList t
5a40: 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a  o Expr.flags,.**
5a50: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
5a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a70: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
5a80: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
5a90: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5aa0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
5ab0: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
5ac0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5ad0: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
5ae0: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
5af0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5b00: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5b10: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5b20: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
5b30: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
5b40: 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74  e if( p->x.pList
5b50: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
5b60: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
5b70: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
5b80: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20      p->flags |= 
5b90: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73  EP_Propagate & s
5ba0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
5bb0: 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  ags(p->x.pList);
5bc0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
5bd0: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
5be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
5bf0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
5c00: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
5c10: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
5c20: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
5c30: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
5c40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
5c50: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
5c60: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
5c70: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
5c80: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
5c90: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
5ca0: 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70  gate all EP_Prop
5cb0: 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d  agate flags from
5cc0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
5cd0: 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66  t into.** Expr.f
5ce0: 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  lags. .*/.void s
5cf0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
5d00: 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73  ghtAndFlags(Pars
5d10: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
5d20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  *p){.  if( pPars
5d30: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
5d40: 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68  ;.  exprSetHeigh
5d50: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t(p);.  sqlite3E
5d60: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
5d70: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
5d80: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
5d90: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
5da0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
5db0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
5dc0: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
5dd0: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
5de0: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
5df0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
5e00: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
5e10: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
5e20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5e30: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5e40: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
5e50: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
5e60: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73   nHeight;.}.#els
5e70: 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69  e /* ABOVE:  Hei
5e80: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
5e90: 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a  enabled.  BELOW:
5ea0: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
5eb0: 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a  ent off */./*.**
5ec0: 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   Propagate all E
5ed0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5ee0: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
5ef0: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
5f00: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
5f10: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5f20: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
5f30: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
5f40: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5f50: 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74   p && p->x.pList
5f60: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
5f70: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
5f80: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  lect) ){.    p->
5f90: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
5fa0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
5fb0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
5fc0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  x.pList);.  }.}.
5fd0: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
5fe0: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
5ff0: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
6000: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
6010: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6020: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
6030: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
6040: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
6050: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
6060: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
6070: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
6080: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
6090: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
60a0: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
60b0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
60c0: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
60d0: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
60e0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
60f0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
6100: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
6110: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
6120: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
6130: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
6140: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
6150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
6160: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
6170: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
6180: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
6190: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
61a0: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
61b0: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
61c0: 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64  erformed.  The d
61d0: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
61e0: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
61f0: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
6200: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
6210: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
6220: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
6230: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
6240: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
6250: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
6260: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
6270: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
6280: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
6290: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
62a0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
62b0: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
62c0: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
62d0: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
62e0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
62f0: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
6300: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
6310: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
6320: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
6330: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
6340: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
6350: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
6360: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
6370: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
6380: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
6390: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
63a0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
63b0: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
63c0: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
63d0: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
63e0: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
63f0: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
6400: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
6410: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
6420: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6430: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
6440: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6450: 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74  RawNN() */.  int
6460: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6470: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6480: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
6490: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
64a0: 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  en,    /* Token 
64b0: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
64c0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
64d0: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
64e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
64f0: 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20   dequote */.){. 
6500: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
6510: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
6520: 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b   int iValue = 0;
6530: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
6540: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
6550: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21  n ){.    if( op!
6560: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70  =TK_INTEGER || p
6570: 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20  Token->z==0.    
6580: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
6590: 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d  GetInt32(pToken-
65a0: 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20  >z, &iValue)==0 
65b0: 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  ){.      nExtra 
65c0: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20  = pToken->n+1;. 
65d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61       assert( iVa
65e0: 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  lue>=0 );.    }.
65f0: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c    }.  pNew = sql
6600: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
6610: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
6620: 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66  r)+nExtra);.  if
6630: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65  ( pNew ){.    me
6640: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
6650: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20  zeof(Expr));.   
6660: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
6670: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
6680: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
6690: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
66a0: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
66b0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
66c0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
66d0: 61 6c 75 65 7c 45 50 5f 4c 65 61 66 3b 0a 20 20  alue|EP_Leaf;.  
66e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
66f0: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
6700: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6710: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6720: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
6730: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6740: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6750: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
6760: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
6770: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
6780: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
6790: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
67a0: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
67b0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
67c0: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
67d0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
67e0: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
67f0: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
6800: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
6810: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
6820: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
6830: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6840: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6850: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
6860: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
6870: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
6880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6890: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
68a0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
68b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
68c0: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
68d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
68e0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
68f0: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
6900: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
6910: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
6920: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
6930: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6940: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6950: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
6960: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6980: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
6990: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
69a0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
69b0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
69c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
69d0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
69e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
69f0: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
6a00: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
6a10: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6a20: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
6a30: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6a40: 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    x.n = sqlite3S
6a50: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 3b  trlen30(zToken);
6a60: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
6a70: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f  3ExprAlloc(db, o
6a80: 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  p, &x, 0);.}../*
6a90: 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74 72  .** Attach subtr
6aa0: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
6ab0: 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70 72  ight to the Expr
6ac0: 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a   node pRoot..**.
6ad0: 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c  ** If pRoot==NUL
6ae0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  L that means tha
6af0: 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  t a memory alloc
6b00: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
6b10: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
6b20: 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74  that case, delet
6b30: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 70  e the subtrees p
6b40: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
6b50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6b60: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
6b70: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  es(.  sqlite3 *d
6b80: 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74  b,.  Expr *pRoot
6b90: 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  ,.  Expr *pLeft,
6ba0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a  .  Expr *pRight.
6bb0: 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d  ){.  if( pRoot==
6bc0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
6bd0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6be0: 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
6bf0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
6c00: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
6c10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6c20: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
6c30: 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  e{.    if( pRigh
6c40: 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  t ){.      pRoot
6c50: 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68  ->pRight = pRigh
6c60: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c70: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c80: 61 67 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e  agate & pRight->
6c90: 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20  flags;.    }.   
6ca0: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
6cb0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74      pRoot->pLeft
6cc0: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
6cd0: 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pRoot->flags |= 
6ce0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70  EP_Propagate & p
6cf0: 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Left->flags;.   
6d00: 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65   }.    exprSetHe
6d10: 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d  ight(pRoot);.  }
6d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
6d30: 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20  te an Expr node 
6d40: 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d  which joins as m
6d50: 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72  any as two subtr
6d60: 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f  ees..**.** One o
6d70: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75  r both of the su
6d80: 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55  btrees can be NU
6d90: 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  LL.  Return a po
6da0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
6db0: 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  .** Expr node.  
6dc0: 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  Or, if an OOM er
6dd0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
6de0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
6df0: 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65  ocFailed,.** fre
6e00: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61  e the subtrees a
6e10: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
6e20: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6e30: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
6e40: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
6e50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6e60: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
6e90: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
6ea0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
6eb0: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
6ec0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
6ed0: 69 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20  ight            
6ee0: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
6ef0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
6f00: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
6f10: 4e 44 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  ND && pParse->nE
6f20: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  rr==0 ){.    /* 
6f30: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
6f40: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
6f50: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
6f60: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
6f70: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
6f80: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
6f90: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
6fa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
6fb0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6fc0: 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
6fd0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
6fe0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
6ff0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
7000: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
7010: 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f  .      p->op = o
7020: 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a  p & TKFLG_MASK;.
7030: 20 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20        p->iAgg = 
7040: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  -1;.    }.    sq
7050: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
7060: 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e  ubtrees(pParse->
7070: 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52  db, p, pLeft, pR
7080: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ight);.  }.  if(
7090: 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74   p ) {.    sqlit
70a0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
70b0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
70c0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ight);.  }.  ret
70d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
70e0: 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74  Add pSelect to t
70f0: 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  he Expr.x.pSelec
7100: 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66  t field.  Or, if
7110: 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28   pExpr is NULL (
7120: 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f  due.** do a memo
7130: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
7140: 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65  ilure) then dele
7150: 74 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f  te the pSelect o
7160: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
7170: 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
7180: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
7190: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
71a0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
71b0: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  ){.  if( pExpr )
71c0: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70  {.    pExpr->x.p
71d0: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
71e0: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  ;.    ExprSetPro
71f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7200: 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62  xIsSelect|EP_Sub
7210: 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  query);.    sqli
7220: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
7230: 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c  AndFlags(pParse,
7240: 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65   pExpr);.  }else
7250: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7260: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
7270: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
7280: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
7290: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
72a0: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  elect);.  }.}...
72b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
72c0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
72d0: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
72e0: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
72f0: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
7300: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
7310: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
7320: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
7330: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
7340: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
7350: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
7360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
7370: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
7380: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
7390: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
73a0: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
73b0: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
73c0: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
73d0: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
73e0: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
73f0: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
7400: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
7410: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
7420: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
7430: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
7440: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
7450: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
7460: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
7470: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
7480: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7490: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
74a0: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
74b0: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
74c0: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
74d0: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
74e0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
74f0: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
7500: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
7510: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
7520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
7530: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
7540: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
7550: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
7560: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
7570: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
7580: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
7590: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
75a0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
75b0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
75c0: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
75d0: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
75e0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
75f0: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7600: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7610: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
7620: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7630: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
7640: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
7650: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
7660: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
7670: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
7680: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
7690: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
76a0: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
76b0: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
76c0: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
76d0: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
76e0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
76f0: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
7700: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
7710: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
7720: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
7730: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
7740: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
7750: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
7760: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
7770: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
7780: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
7790: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
77a0: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
77b0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
77c0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
77d0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
77e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
77f0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
7800: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
7810: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
7820: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
7830: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
7840: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
7850: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
7860: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
7870: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7880: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
7890: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
78a0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
78b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
78c0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
78d0: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
78e0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
78f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
7900: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
7910: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7920: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
7930: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
7940: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
7950: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
7960: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
7970: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
7980: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
7990: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
79a0: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
79b0: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
79c0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
79d0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
79e0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  xprFunction(Pars
79f0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
7a00: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
7a10: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
7a20: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69  pr *pNew;.  sqli
7a30: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7a40: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
7a50: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
7a60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
7a70: 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54  loc(db, TK_FUNCT
7a80: 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ION, pToken, 1);
7a90: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
7aa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
7ab0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
7ac0: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
7ad0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65   memory leak whe
7ae0: 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  n malloc fails *
7af0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
7b00: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
7b10: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45  ist = pList;.  E
7b20: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7b30: 4e 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29  New, EP_HasFunc)
7b40: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
7b50: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7b60: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
7b70: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
7b80: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
7b90: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
7ba0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
7bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
7bc0: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
7bd0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
7be0: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
7bf0: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
7c00: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
7c10: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
7c20: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7c30: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
7c40: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
7c50: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
7c60: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
7c70: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
7c80: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7c90: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7ca0: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
7cb0: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
7cc0: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
7cd0: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
7ce0: 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69 64  too big to avoid
7cf0: 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72   a denial of ser
7d00: 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e  vice attack when
7d10: 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
7d20: 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d  ement comes from
7d30: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75   an external sou
7d40: 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  rce..**.** Wildc
7d50: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
7d60: 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c   ":aaa", "@aaa",
7d70: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
7d80: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
7d90: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
7da0: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
7db0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
7dc0: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
7dd0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
7de0: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
7df0: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
7e00: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7e10: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
7e20: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
7e30: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
7e40: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
7e50: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
7e60: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
7e70: 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c  r, u32 n){.  sql
7e80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7e90: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
7ea0: 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20  har *z;.  ynVar 
7eb0: 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  x;..  if( pExpr=
7ec0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
7ed0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
7ee0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
7ef0: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
7f00: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
7f10: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
7f20: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
7f30: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
7f40: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
7f50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
7f60: 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33 53 74  ==(u32)sqlite3St
7f70: 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69  rlen30(z) );.  i
7f80: 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20  f( z[1]==0 ){.  
7f90: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
7fa0: 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20   the form "?".  
7fb0: 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20  Assign the next 
7fc0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7fd0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  */.    assert( z
7fe0: 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20  [0]=='?' );.    
7ff0: 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  x = (ynVar)(++pP
8000: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d  arse->nVar);.  }
8010: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f  else{.    int do
8020: 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Add = 0;.    if(
8030: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
8040: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
8050: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
8060: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
8070: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
8080: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
8090: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
80a0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
80b0: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
80c0: 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20    int bOk;.     
80d0: 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f   if( n==2 ){ /*O
80e0: 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54  PTIMIZATION-IF-T
80f0: 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 69 20  RUE*/.        i 
8100: 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20  = z[1]-'0';  /* 
8110: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
8120: 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67  of ?N for a sing
8130: 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20  le digit N */.  
8140: 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20        bOk = 1;. 
8150: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8160: 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c      bOk = 0==sql
8170: 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d  ite3Atoi64(&z[1]
8180: 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54  , &i, n-1, SQLIT
8190: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
81a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
81b0: 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   i==0 );.      t
81c0: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
81d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
81e0: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
81f0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8200: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29  ABLE_NUMBER]-1 )
8210: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8220: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
8230: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
8240: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b  IABLE_NUMBER] );
8250: 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d  .      if( bOk==
8260: 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62  0 || i<1 || i>db
8270: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8280: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8290: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
82a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
82b0: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
82c0: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
82d0: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
82e0: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
82f0: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
8300: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8310: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20  ABLE_NUMBER]);. 
8320: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
8330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78 20 3d       }.      x =
8340: 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20   (ynVar)i;.     
8350: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
8360: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Var ){.        p
8370: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69  Parse->nVar = (i
8380: 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20 64 6f  nt)x;.        do
8390: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
83a0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
83b0: 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70  VListNumToName(p
83c0: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78  Parse->pVList, x
83d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
83e0: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
83f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8400: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73      /* Wildcards
8410: 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24   like ":aaa", "$
8420: 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20  aaa" or "@aaa". 
8430: 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   Reuse the same 
8440: 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
8450: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
8460: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
8470: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
8480: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
8490: 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  e.      ** has n
84a0: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
84b0: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
84c0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
84d0: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mber.      */.  
84e0: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 73      x = (ynVar)s
84f0: 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d 65 54  qlite3VListNameT
8500: 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c  oNum(pParse->pVL
8510: 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  ist, z, n);.    
8520: 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20    if( x==0 ){.  
8530: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
8540: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
8550: 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64  );.        doAdd
8560: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
8570: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 41 64    }.    if( doAd
8580: 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  d ){.      pPars
8590: 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71 6c 69  e->pVList = sqli
85a0: 74 65 33 56 4c 69 73 74 41 64 64 28 64 62 2c 20  te3VListAdd(db, 
85b0: 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
85c0: 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a  z, n, x);.    }.
85d0: 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f    }.  pExpr->iCo
85e0: 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20  lumn = x;.  if( 
85f0: 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  x>db->aLimit[SQL
8600: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8610: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
8620: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8630: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8640: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
8650: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
8660: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
8670: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
8680: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  on tree..*/.stat
8690: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
86a0: 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  NE void sqlite3E
86b0: 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  xprDeleteNN(sqli
86c0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
86d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
86e0: 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  0 );.  /* Sanity
86f0: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
8700: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
8710: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
8720: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
8730: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
8740: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8750: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
8760: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
8770: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8780: 45 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48  EBUG.  if( ExprH
8790: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
87a0: 5f 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48  _Leaf) && !ExprH
87b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
87c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
87d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
87e0: 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  eft==0 );.    as
87f0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
8800: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
8810: 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d  ( p->x.pSelect==
8820: 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0 );.  }.#endif.
8830: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
8840: 6f 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f  operty(p, (EP_To
8850: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
8860: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
8870: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
8880: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
8890: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
88a0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
88b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
88c0: 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  List==0 || p->pR
88d0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
88e0: 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70  f( p->pLeft && p
88f0: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op!=TK_SELECT_
8900: 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33  COLUMN ) sqlite3
8910: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8920: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20   p->pLeft);.    
8930: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b  if( p->pRight ){
8940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
8950: 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70  prDeleteNN(db, p
8960: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
8970: 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73  else if( ExprHas
8980: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
8990: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
89a0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
89b0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
89c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
89d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
89e0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
89f0: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
8a00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8a10: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8a20: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
8a30: 29 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  ) ) sqlite3DbFre
8a40: 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e(db, p->u.zToke
8a50: 6e 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  n);.  if( !ExprH
8a60: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8a70: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
8a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
8a90: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  db, p);.  }.}.vo
8aa0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
8ab0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
8ac0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
8ad0: 28 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70  ( p ) sqlite3Exp
8ae0: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29  rDeleteNN(db, p)
8af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8b00: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8b10: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
8b20: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
8b30: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  on structure .**
8b40: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
8b50: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
8b60: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  his is always on
8b70: 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49  e of EXPR_FULLSI
8b80: 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55  ZE,.** EXPR_REDU
8b90: 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f  CEDSIZE or EXPR_
8ba0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a  TOKENONLYSIZE..*
8bb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
8bc0: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
8bd0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
8be0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8bf0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72  P_TokenOnly) ) r
8c00: 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e  eturn EXPR_TOKEN
8c10: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20  ONLYSIZE;.  if( 
8c20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8c30: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  p, EP_Reduced) )
8c40: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44   return EXPR_RED
8c50: 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75  UCEDSIZE;.  retu
8c60: 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  rn EXPR_FULLSIZE
8c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
8c80: 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20  upedExpr*Size() 
8c90: 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65  routines each re
8ca0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8cb0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
8cc0: 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20  d.** to store a 
8cd0: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
8ce0: 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73  ssion or express
8cf0: 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20  ion tree.  They 
8d00: 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77  differ in.** how
8d10: 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65   much of the tre
8d20: 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a  e is measured..*
8d30: 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  *.**     dupedEx
8d40: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20  prStructSize()  
8d50: 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20     Size of only 
8d60: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
8d70: 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  re .**     duped
8d80: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20  ExprNodeSize()  
8d90: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70       Size of Exp
8da0: 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f  r + space for to
8db0: 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  ken.**     duped
8dc0: 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20  ExprSize()      
8dd0: 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65       Expr + toke
8de0: 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70  n + subtree comp
8df0: 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  onents.**.******
8e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e40: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
8e50: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8e60: 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72  ize() function r
8e70: 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65  eturns two value
8e80: 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  s OR-ed together
8e90: 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73  :  .** (1) the s
8ea0: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
8eb0: 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  r a copy of the 
8ec0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f  Expr structure o
8ed0: 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20  nly and .** (2) 
8ee0: 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73  the EP_xxx flags
8ef0: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
8f00: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
8f10: 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  e size should be
8f20: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
8f30: 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73  values is always
8f40: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
8f50: 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a      EXPR_FULLSIZ
8f60: 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52  E.**      EXPR_R
8f70: 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45  EDUCEDSIZE   | E
8f80: 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20  P_Reduced.**    
8f90: 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59    EXPR_TOKENONLY
8fa0: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
8fb0: 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  nly.**.** The si
8fc0: 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ze of the struct
8fd0: 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ure can be found
8fe0: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20   by masking the 
8ff0: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
9000: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
9010: 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65  with 0xfff.  The
9020: 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f   flags can be fo
9030: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
9040: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
9050: 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63  ue with EP_Reduc
9060: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e  ed|EP_TokenOnly.
9070: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
9080: 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50   with flags==EXP
9090: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69  RDUP_REDUCE, thi
90a0: 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73  s routines works
90b0: 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a   on full-size.**
90c0: 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70   (unreduced) Exp
90d0: 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65  r objects as the
90e0: 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20  y or originally 
90f0: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
9100: 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75  he parser..** Du
9110: 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  ring expression 
9120: 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20  analysis, extra 
9130: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63  information is c
9140: 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65  omputed and move
9150: 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20  d into.** later 
9160: 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70  parts of teh Exp
9170: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  r object and tha
9180: 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  t extra informat
9190: 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68  ion might get ch
91a0: 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20  opped.** off if 
91b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
91c0: 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65  s reduced.  Note
91d0: 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f   also that it do
91e0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a  es not work to.*
91f0: 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55  * make an EXPRDU
9200: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
9210: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
9220: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
9230: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
9240: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
9250: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
9260: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
9270: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
9280: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
9290: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
92a0: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
92b0: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
92c0: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
92d0: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
92e0: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
92f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9300: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9310: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
9320: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
9330: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
9340: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
9350: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
9360: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
9370: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
9380: 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owed */.  assert
9390: 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c  ( EXPR_FULLSIZE<
93a0: 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65  =0xfff );.  asse
93b0: 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50  rt( (0xfff & (EP
93c0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
93d0: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
93e0: 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20  if( 0==flags || 
93f0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
9400: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6e  _COLUMN ){.    n
9410: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
9420: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
9430: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9440: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9450: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
9460: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
9470: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9480: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
9490: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
94a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
94b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
94c0: 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20  emToken) );.    
94d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
94e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
94f0: 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20  oReduce) );.    
9500: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
9510: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
9520: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
9530: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
9540: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
9550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
9560: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
9570: 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   );.      nSize 
9580: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
9590: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
95a0: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nly;.    }.  }. 
95b0: 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d   return nSize;.}
95c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
95d0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
95e0: 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  e space in bytes
95f0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
9600: 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20  re the copy .** 
9610: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9620: 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79  cture and a copy
9630: 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a   of the Expr.u.z
9640: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
9650: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
9660: 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a  is defined.).*/.
9670: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
9680: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
9690: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
96a0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
96b0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
96c0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20  ize(p, flags) & 
96d0: 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78  0xfff;.  if( !Ex
96e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
96f0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9700: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9710: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
9720: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
9730: 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d  u.zToken)+1;.  }
9740: 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
9750: 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (nByte);.}../*.*
9760: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
9770: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
9780: 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20  uired to create 
9790: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  a duplicate of t
97a0: 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
97b0: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
97c0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
97d0: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
97e0: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b  ent is a.** mask
97f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52   containing EXPR
9800: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
9810: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
9820: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
9830: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
9840: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
9850: 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74  xpr struct.** it
9860: 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66  self and the buf
9870: 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20  fer referred to 
9880: 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  by Expr.u.zToken
9890: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  , if any..**.** 
98a0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
98b0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
98c0: 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  t, then the retu
98d0: 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65  rn value include
98e0: 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64  s .** space to d
98f0: 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70  uplicate all Exp
9900: 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74  r nodes in the t
9910: 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78  ree formed by Ex
9920: 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64  pr.pLeft .** and
9930: 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72   Expr.pRight var
9940: 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20  iables (but not 
9950: 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72  for any structur
9960: 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72  es pointed to or
9970: 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66   .** descended f
9980: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
9990: 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70  List or Expr.x.p
99a0: 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73  Select variables
99b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
99c0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45   dupedExprSize(E
99d0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
99e0: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
99f0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
9a00: 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65      nByte = dupe
9a10: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
9a20: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
9a30: 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52   flags&EXPRDUP_R
9a40: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e  EDUCE ){.      n
9a50: 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70  Byte += dupedExp
9a60: 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20  rSize(p->pLeft, 
9a70: 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78  flags) + dupedEx
9a80: 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74  prSize(p->pRight
9a90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
9aa0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79    }.  return nBy
9ab0: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  te;.}../*.** Thi
9ac0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
9ad0: 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
9ae0: 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70  ExprDup(), excep
9af0: 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66  t that if pzBuff
9b00: 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55  er .** is not NU
9b10: 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65  LL then *pzBuffe
9b20: 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
9b30: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
9b40: 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a  r large enough .
9b50: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
9b60: 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
9b70: 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73  on p, the copies
9b80: 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a   of p->u.zToken.
9b90: 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  ** (if applicabl
9ba0: 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69  e), and the copi
9bb0: 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65  es of the p->pLe
9bc0: 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74  ft and p->pRight
9bd0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
9be0: 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20   if any. Before 
9bf0: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75  returning, *pzBu
9c00: 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74  ffer is set to t
9c10: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
9c20: 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f  st the.** portio
9c30: 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  n of the buffer 
9c40: 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74  copied into by t
9c50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
9c60: 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78  .static Expr *ex
9c70: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
9c80: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
9c90: 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70  dupFlags, u8 **p
9ca0: 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72  zBuffer){.  Expr
9cb0: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
9cc0: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
9cd0: 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41  turn */.  u8 *zA
9ce0: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
9cf0: 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20  /* Memory space 
9d00: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 75  from which to bu
9d10: 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20  ild Expr object 
9d20: 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63 46  */.  u32 staticF
9d30: 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45 50  lag;       /* EP
9d40: 5f 53 74 61 74 69 63 20 69 66 20 73 70 61 63 65  _Static if space
9d50: 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66 72   not obtained fr
9d60: 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20  om malloc */..  
9d70: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
9d80: 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
9d90: 20 20 61 73 73 65 72 74 28 20 64 75 70 46 6c 61    assert( dupFla
9da0: 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67  gs==0 || dupFlag
9db0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
9dc0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
9dd0: 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75  zBuffer==0 || du
9de0: 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f  pFlags==EXPRDUP_
9df0: 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20  REDUCE );..  /* 
9e00: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
9e10: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
9e20: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
9e30: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75 66  . */.  if( pzBuf
9e40: 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f  fer ){.    zAllo
9e50: 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20  c = *pzBuffer;. 
9e60: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
9e70: 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c  EP_Static;.  }el
9e80: 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  se{.    zAlloc =
9e90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
9ea0: 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45  RawNN(db, dupedE
9eb0: 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  xprSize(p, dupFl
9ec0: 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74 69  ags));.    stati
9ed0: 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  cFlag = 0;.  }. 
9ee0: 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29   pNew = (Expr *)
9ef0: 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70  zAlloc;..  if( p
9f00: 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  New ){.    /* Se
9f10: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
9f20: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
9f30: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
9f40: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
9f50: 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68    ** by pNew. Th
9f60: 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58 50  is is either EXP
9f70: 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52  R_FULLSIZE, EXPR
9f80: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a  _REDUCEDSIZE or.
9f90: 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45      ** EXPR_TOKE
9fa0: 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65  NONLYSIZE. nToke
9fb0: 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
9fc0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9fd0: 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20  consumed.    ** 
9fe0: 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  by the copy of t
9ff0: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
a000: 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a  tring (if any)..
a010: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74      */.    const
a020: 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63   unsigned nStruc
a030: 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70  tSize = dupedExp
a040: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 64  rStructSize(p, d
a050: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f  upFlags);.    co
a060: 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  nst int nNewSize
a070: 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26   = nStructSize &
a080: 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74 20   0xfff;.    int 
a090: 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20  nToken;.    if( 
a0a0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a0b0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
a0c0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
a0d0: 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  ){.      nToken 
a0e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a0f0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b  0(p->u.zToken) +
a100: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
a110: 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b       nToken = 0;
a120: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
a130: 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  upFlags ){.     
a140: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
a150: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
a160: 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
a170: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
a180: 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b  c, p, nNewSize);
a190: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a1a0: 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75    u32 nSize = (u
a1b0: 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69 7a  32)exprStructSiz
a1c0: 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  e(p);.      memc
a1d0: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53  py(zAlloc, p, nS
a1e0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
a1f0: 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53  nSize<EXPR_FULLS
a200: 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20  IZE ){ .        
a210: 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e  memset(&zAlloc[n
a220: 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46  Size], 0, EXPR_F
a230: 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a  ULLSIZE-nSize);.
a240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a250: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50     /* Set the EP
a260: 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b  _Reduced, EP_Tok
a270: 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53  enOnly, and EP_S
a280: 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72  tatic flags appr
a290: 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  opriately. */.  
a2a0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d    pNew->flags &=
a2b0: 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50   ~(EP_Reduced|EP
a2c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74  _TokenOnly|EP_St
a2d0: 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e  atic|EP_MemToken
a2e0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  );.    pNew->fla
a2f0: 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a  gs |= nStructSiz
a300: 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  e & (EP_Reduced|
a310: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20  EP_TokenOnly);. 
a320: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
a330: 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20  = staticFlag;.. 
a340: 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70     /* Copy the p
a350: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
a360: 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  g, if any. */.  
a370: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
a380: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b        char *zTok
a390: 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f  en = pNew->u.zTo
a3a0: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41  ken = (char*)&zA
a3b0: 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a  lloc[nNewSize];.
a3c0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f        memcpy(zTo
a3d0: 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken, p->u.zToken
a3e0: 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  , nToken);.    }
a3f0: 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70  ..    if( 0==((p
a400: 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c  ->flags|pNew->fl
a410: 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e  ags) & (EP_Token
a420: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29  Only|EP_Leaf)) )
a430: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20  {.      /* Fill 
a440: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70  in the pNew->x.p
a450: 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e  Select or pNew->
a460: 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20  x.pList member. 
a470: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  */.      if( Exp
a480: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a490: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
a4a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
a4b0: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
a4c0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
a4d0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75  p->x.pSelect, du
a4e0: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d  pFlags);.      }
a4f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
a500: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
a510: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a520: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
a530: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a540: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
a550: 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e  * Fill in pNew->
a560: 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e  pLeft and pNew->
a570: 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69  pRight. */.    i
a580: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a590: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
a5a0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
a5b0: 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  ) ){.      zAllo
a5c0: 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  c += dupedExprNo
a5d0: 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  deSize(p, dupFla
a5e0: 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gs);.      if( !
a5f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a600: 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  pNew, EP_TokenOn
a610: 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20  ly|EP_Leaf) ){. 
a620: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
a630: 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a  ft = p->pLeft ?.
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
a660: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
a670: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a680: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a690: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
a6a0: 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20   p->pRight ?.   
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20      exprDup(db, 
a6d0: 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44  p->pRight, EXPRD
a6e0: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
a6f0: 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  oc) : 0;.      }
a700: 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66  .      if( pzBuf
a710: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  fer ){.        *
a720: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
a730: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
a740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
a750: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a760: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
a770: 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20  |EP_Leaf) ){.   
a780: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f       if( pNew->o
a790: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
a7a0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
a7b0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
a7c0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
a7d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43     assert( p->iC
a7e0: 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70  olumn==0 || p->p
a7f0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
a800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a810: 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70  >pRight==0  || p
a820: 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65  ->pRight==p->pLe
a830: 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ft );.        }e
a840: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
a850: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
a860: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a870: 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  p->pLeft, 0);.  
a880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a890: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
a8a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a8b0: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  , p->pRight, 0);
a8c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a8d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
a8e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
a8f0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
a900: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
a910: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
a920: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
a930: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20  argument. If an 
a940: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
a950: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55   encountered, NU
a960: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
a970: 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61  * and the db->ma
a980: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
a990: 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  set..*/.#ifndef 
a9a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
a9b0: 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74  static With *wit
a9c0: 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  hDup(sqlite3 *db
a9d0: 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69  , With *p){.  Wi
a9e0: 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  th *pRet = 0;.  
a9f0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
aa00: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
aa10: 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e  *p) + sizeof(p->
aa20: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65  a[0]) * (p->nCte
aa30: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
aa40: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
aa50: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
aa60: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
aa70: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
aa80: 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20     pRet->nCte = 
aa90: 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66  p->nCte;.      f
aaa0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
aab0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
aac0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pRet->a[i].pSel
aad0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
aae0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  ectDup(db, p->a[
aaf0: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  i].pSelect, 0);.
ab00: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
ab10: 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74  i].pCols = sqlit
ab20: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
ab30: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c  , p->a[i].pCols,
ab40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
ab50: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
ab60: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ab70: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  db, p->a[i].zNam
ab80: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
ab90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
aba0: 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Ret;.}.#else.# d
abb0: 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c  efine withDup(x,
abc0: 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y) 0.#endif../*.
abd0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
abe0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
abf0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
ac00: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
ac10: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
ac20: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
ac30: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
ac40: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
ac50: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
ac60: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
ac70: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
ac80: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
ac90: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
aca0: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
acb0: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
acc0: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
acd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
ace0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
acf0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
ad00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ad10: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
ad20: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
ad30: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
ad40: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
ad50: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
ad60: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
ad70: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
ad80: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
ad90: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
ada0: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
adb0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
adc0: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
add0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
ade0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
adf0: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
ae00: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
ae10: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
ae20: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
ae30: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
ae40: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
ae50: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
ae60: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
ae70: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
ae80: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
ae90: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
aea0: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
aeb0: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
aec0: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
aed0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
aee0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
aef0: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
af00: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
af10: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
af20: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
af30: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  s){.  assert( fl
af40: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
af50: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
af60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20  );.  return p ? 
af70: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66  exprDup(db, p, f
af80: 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a  lags, 0) : 0;.}.
af90: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
afa0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
afb0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
afc0: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
afd0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
afe0: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
aff0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
b000: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
b010: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
b020: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20  pPriorSelectCol 
b030: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64  = 0;.  assert( d
b040: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b050: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b060: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
b070: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
b080: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b090: 53 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20 20  Size(db, p));.  
b0a0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b0b0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
b0c0: 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72  nExpr = p->nExpr
b0d0: 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65 77  ;.  pItem = pNew
b0e0: 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20  ->a;.  pOldItem 
b0f0: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
b100: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
b110: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
b120: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
b130: 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70  pr *pOldExpr = p
b140: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  OldItem->pExpr;.
b150: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b160: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
b170: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
b180: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
b190: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
b1a0: 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20  if( pOldExpr .  
b1b0: 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e     && pOldExpr->
b1c0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
b1d0: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e  LUMN.     && (pN
b1e0: 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  ewExpr = pItem->
b1f0: 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29  pExpr)!=0 .    )
b200: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b210: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
b220: 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20  n==0 || i>0 );. 
b230: 20 20 20 20 20 69 66 28 20 70 4e 65 77 45 78 70       if( pNewExp
b240: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
b250: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b260: 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74   pOldExpr->pLeft
b270: 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67  ==pOldExpr->pRig
b280: 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ht );.        pP
b290: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20  riorSelectCol = 
b2a0: 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20  pNewExpr->pLeft 
b2b0: 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67  = pNewExpr->pRig
b2c0: 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ht;.      }else{
b2d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b2e0: 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20   i>0 );.        
b2f0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31  assert( pItem[-1
b300: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
b310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
b320: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
b330: 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72  =pItem[-1].pExpr
b340: 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20  ->iColumn+1 );. 
b350: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b360: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d  PriorSelectCol==
b370: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d  pItem[-1].pExpr-
b380: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
b390: 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66    pNewExpr->pLef
b3a0: 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74  t = pPriorSelect
b3b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
b3c0: 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e   }.    pItem->zN
b3d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
b3e0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b3f0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
b400: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
b410: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b420: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
b430: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
b440: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
b450: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
b460: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
b470: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
b480: 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f  >bSpanIsTab = pO
b490: 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54  ldItem->bSpanIsT
b4a0: 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75  ab;.    pItem->u
b4b0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a   = pOldItem->u;.
b4c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
b4d0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
b4e0: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
b4f0: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
b500: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
b510: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
b520: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
b530: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
b540: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
b550: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
b560: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
b570: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
b580: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b590: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
b5a0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
b5b0: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
b5c0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
b5d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
b5e0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
b5f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
b600: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
b610: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
b620: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
b630: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
b640: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b650: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
b660: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
b670: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
b680: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
b690: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
b6a0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
b6b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
b6c0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
b6d0: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
b6e0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
b6f0: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
b700: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
b710: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
b720: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
b730: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b740: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
b750: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
b760: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
b770: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
b780: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
b790: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
b7a0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
b7b0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
b7c0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
b7d0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
b7e0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
b7f0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
b800: 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20  ewItem->pSchema 
b810: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68  = pOldItem->pSch
b820: 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ema;.    pNewIte
b830: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
b840: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b850: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
b860: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
b870: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
b880: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b890: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
b8a0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
b8b0: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
b8c0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b8d0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
b8e0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b8f0: 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  >fg = pOldItem->
b900: 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  fg;.    pNewItem
b910: 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64  ->iCursor = pOld
b920: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
b930: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64     pNewItem->add
b940: 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49  rFillSub = pOldI
b950: 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
b960: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b970: 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64  regReturn = pOld
b980: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
b990: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65  .    if( pNewIte
b9a0: 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
b9b0: 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  y ){.      pNewI
b9c0: 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
b9d0: 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  By = sqlite3DbSt
b9e0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b9f0: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
ba00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
ba10: 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20  wItem->pIBIndex 
ba20: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49  = pOldItem->pIBI
ba30: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e  ndex;.    if( pN
ba40: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62  ewItem->fg.isTab
ba50: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e  Func ){.      pN
ba60: 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ewItem->u1.pFunc
ba70: 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20  Arg = .         
ba80: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ba90: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
baa0: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66  ->u1.pFuncArg, f
bab0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lags);.    }.   
bac0: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
bad0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
bae0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
baf0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
bb00: 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
bb10: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
bb20: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
bb30: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
bb40: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  b, pOldItem->pSe
bb50: 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  lect, flags);.  
bb60: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
bb70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
bb80: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
bb90: 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  On, flags);.    
bba0: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
bbb0: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
bbc0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bbd0: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
bbe0: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
bbf0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
bc00: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
bc10: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
bc20: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
bc30: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
bc40: 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49   IdList *p){.  I
bc50: 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  dList *pNew;.  i
bc60: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
bc70: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
bc80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bc90: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
bca0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
bcb0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
bcc0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
bcd0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
bce0: 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49  New->nId = p->nI
bcf0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
bd00: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
bd10: 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  wNN(db, p->nId*s
bd20: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
bd30: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
bd40: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
bd50: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e  3DbFreeNN(db, pN
bd60: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
bd70: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65  0;.  }.  /* Note
bd80: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68   that because th
bd90: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c  e size of the al
bda0: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e  location for p->
bdb0: 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  a[] is not.  ** 
bdc0: 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f  necessarily a po
bdd0: 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69  wer of two, sqli
bde0: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
bdf0: 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c  ) may not be cal
be00: 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  led.  ** on the 
be10: 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65  duplicate create
be20: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
be30: 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  on. */.  for(i=0
be40: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
be50: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
be60: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
be70: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
be80: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
be90: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
bea0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
beb0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
bec0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
bed0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
bee0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
bef0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
bf00: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
bf10: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
bf20: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
bf30: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
bf40: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
bf50: 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73  *pDup, int flags
bf60: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65  ){.  Select *pRe
bf70: 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20  t = 0;.  Select 
bf80: 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65  *pNext = 0;.  Se
bf90: 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65  lect **pp = &pRe
bfa0: 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a  t;.  Select *p;.
bfb0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
bfc0: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70   );.  for(p=pDup
bfd0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72  ; p; p=p->pPrior
bfe0: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
bff0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
c000: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c010: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20  izeof(*p) );.   
c020: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62   if( pNew==0 ) b
c030: 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  reak;.    pNew->
c040: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
c050: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
c060: 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73  p->pEList, flags
c070: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72  );.    pNew->pSr
c080: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
c090: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
c0a0: 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  c, flags);.    p
c0b0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
c0c0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c0d0: 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67   p->pWhere, flag
c0e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47  s);.    pNew->pG
c0f0: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
c100: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
c110: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
c120: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c130: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
c140: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
c150: 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a  Having, flags);.
c160: 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72      pNew->pOrder
c170: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
c180: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
c190: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
c1a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  .    pNew->op = 
c1b0: 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  p->op;.    pNew-
c1c0: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a  >pNext = pNext;.
c1d0: 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
c1e0: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
c1f0: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
c200: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
c210: 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Limit, flags);. 
c220: 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20     pNew->iLimit 
c230: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
c240: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
c250: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
c260: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e   p->selFlags & ~
c270: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
c280: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
c290: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
c2a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
c2b0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
c2c0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  ;.    pNew->nSel
c2d0: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
c2e0: 65 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77  ectRow;.    pNew
c2f0: 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75  ->pWith = withDu
c300: 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  p(db, p->pWith);
c310: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
c320: 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
c330: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  p->zSelName);.  
c340: 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20    *pp = pNew;.  
c350: 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50    pp = &pNew->pP
c360: 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20  rior;.    pNext 
c370: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72  = pNew;.  }..  r
c380: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
c390: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
c3a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
c3b0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
c3c0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
c3d0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
c3e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c3f0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
c400: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
c410: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
c420: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
c430: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
c440: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
c450: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
c460: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
c470: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   list..**.** The
c480: 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20   pList argument 
c490: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
c4a0: 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  ULL or a pointer
c4b0: 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a   to an ExprList.
c4c0: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
c4d0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
c4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c4f0: 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20  Append().  This 
c500: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e  routine.** may n
c510: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
c520: 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61  an ExprList obta
c530: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
c540: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a  3ExprListDup()..
c550: 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73  ** Reason:  This
c560: 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
c570: 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
c580: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69   of slots in pLi
c590: 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20  st->a[].** is a 
c5a0: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54  power of two.  T
c5b0: 68 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20  hat is true for 
c5c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c5d0: 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a  ppend() returns.
c5e0: 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65  ** but is not ne
c5f0: 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66  cessarily true f
c600: 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76  rom the return v
c610: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45  alue of sqlite3E
c620: 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a  xprListDup()..**
c630: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
c640: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
c650: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
c660: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
c670: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
c680: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
c690: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
c6a0: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
c6b0: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
c6c0: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
c6d0: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
c6e0: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
c6f0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
c700: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
c710: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
c730: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c740: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
c750: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
c760: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
c770: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
c780: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
c790: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
c7a0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
c7b0: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
c7c0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c7d0: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
c7e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
c7f0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
c800: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c810: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
c820: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
c830: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
c840: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c850: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  wNN(db, sizeof(E
c860: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
c870: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
c880: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
c890: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
c8a0: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20  st->nExpr = 0;. 
c8b0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73   }else if( (pLis
c8c0: 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73  t->nExpr & (pLis
c8d0: 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20  t->nExpr-1))==0 
c8e0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
c8f0: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20  *pNew;.    pNew 
c900: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
c910: 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20  oc(db, pList, . 
c920: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
c930: 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c  of(*pList)+(2*pL
c940: 69 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a  ist->nExpr - 1)*
c950: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
c960: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  0]));.    if( pN
c970: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  ew==0 ){.      g
c980: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
c990: 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  }.    pList = pN
c9a0: 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  ew;.  }.  pItem 
c9b0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
c9c0: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61  t->nExpr++];.  a
c9d0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
c9e0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
c9f0: 69 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a  item,zName)==siz
ca00: 65 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  eof(pItem->pExpr
ca10: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ) );.  assert( o
ca20: 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45  ffsetof(struct E
ca30: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78  xprList_item,pEx
ca40: 70 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  pr)==0 );.  mems
ca50: 65 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  et(&pItem->zName
ca60: 2c 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  ,0,sizeof(*pItem
ca70: 29 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63  )-offsetof(struc
ca80: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c  t ExprList_item,
ca90: 7a 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d  zName));.  pItem
caa0: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
cab0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
cac0: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
cad0: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
cae0: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
caf0: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
cb00: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
cb10: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
cb20: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
cb30: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
cb40: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
cb50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75  ;.}../*.** pColu
cb60: 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f  mns and pExpr fo
cb70: 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69  rm a vector assi
cb80: 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gnment which is 
cb90: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a  part of the SET.
cba0: 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20  ** clause of an 
cbb0: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
cbc0: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
cbd0: 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c  .**        (a,b,
cbe0: 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72  c) = (expr1,expr
cbf0: 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20  2,expr3).** Or: 
cc00: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45     (a,b,c) = (SE
cc10: 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20  LECT x,y,z FROM 
cc20: 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ....).**.** For 
cc30: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
cc40: 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65   vector assignme
cc50: 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65  nt, append new e
cc60: 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a  ntries to the.**
cc70: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
cc80: 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20   pList.  In the 
cc90: 63 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65  case of a subque
cca0: 72 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61  ry on the RHS, a
ccb0: 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45  ppend.** TK_SELE
ccc0: 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73  CT_COLUMN expres
ccd0: 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69  sions..*/.ExprLi
cce0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
ccf0: 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28  istAppendVector(
cd00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cd10: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
cd20: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
cd30: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
cd40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
cd50: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
cd60: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
cd70: 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  LL */.  IdList *
cd80: 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f  pColumns,      /
cd90: 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  * List of names 
cda0: 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73  of LHS of the as
cdb0: 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  signment */.  Ex
cdc0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
cdd0: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65       /* Vector e
cde0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
cdf0: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
ce00: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
ce10: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ce20: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
ce30: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
ce40: 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74  t iFirst = pList
ce50: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
ce60: 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d  : 0;.  /* pColum
ce70: 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e  ns can only be N
ce80: 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f  ULL due to an OO
ce90: 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c  M but an OOM wil
cea0: 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20  l cause an.  ** 
ceb0: 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68  exit prior to th
cec0: 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67  is routine being
ced0: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66   invoked */.  if
cee0: 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73  ( NEVER(pColumns
cef0: 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74  ==0) ) goto vect
cf00: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
cf10: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
cf20: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
cf30: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f  pend_error;..  /
cf40: 2a 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20  * If the RHS is 
cf50: 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77  a vector, then w
cf60: 65 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c  e can immediatel
cf70: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  y check to see t
cf80: 68 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69  hat .  ** the si
cf90: 7a 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e  ze of the RHS an
cfa0: 64 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75  d LHS match.  Bu
cfb0: 74 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  t if the RHS is 
cfc0: 61 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20  a SELECT, .  ** 
cfd0: 77 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20  wildcards ("*") 
cfe0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
cff0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
d000: 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
d010: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20   before.  ** we 
d020: 63 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20  can do the size 
d030: 63 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20  check, so defer 
d040: 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75  the size check u
d050: 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
d060: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
d070: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53   pExpr->op!=TK_S
d080: 45 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e  ELECT && pColumn
d090: 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74  s->nId!=(n=sqlit
d0a0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
d0b0: 28 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20  (pExpr)) ){.    
d0c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d0d0: 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
d0e0: 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
d0f0: 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
d110: 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a  lumns->nId, n);.
d120: 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f      goto vector_
d130: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
d140: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
d150: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69  pColumns->nId; i
d160: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d170: 53 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65  SubExpr = sqlite
d180: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
d190: 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  eld(pParse, pExp
d1a0: 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74  r, i);.    pList
d1b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
d1c0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
d1d0: 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72   pList, pSubExpr
d1e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
d1f0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d200: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
d210: 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20  iFirst+i+1 );.  
d220: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69      pList->a[pLi
d230: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  st->nExpr-1].zNa
d240: 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61  me = pColumns->a
d250: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
d260: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e   pColumns->a[i].
d270: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  zName = 0;.    }
d280: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d  .  }..  if( !db-
d290: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
d2a0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
d2b0: 45 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53 28  ELECT && ALWAYS(
d2c0: 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  pList!=0) ){.   
d2d0: 20 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20   Expr *pFirst = 
d2e0: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d  pList->a[iFirst]
d2f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
d300: 72 74 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b  rt( pFirst!=0 );
d310: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
d320: 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  rst->op==TK_SELE
d330: 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  CT_COLUMN );.   
d340: 20 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20    .    /* Store 
d350: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
d360: 6d 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73  ment in pRight s
d370: 6f 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c  o it will be del
d380: 65 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a  eted when.    **
d390: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d3a0: 44 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c  Delete() is call
d3b0: 65 64 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74  ed */.    pFirst
d3c0: 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  ->pRight = pExpr
d3d0: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b  ;.    pExpr = 0;
d3e0: 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65  ..    /* Remembe
d3f0: 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
d400: 65 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20  e LHS in iTable 
d410: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63  so that we can c
d420: 68 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a  heck that.    **
d430: 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53   the RHS and LHS
d440: 20 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72   sizes match dur
d450: 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ing code generat
d460: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72  ion. */.    pFir
d470: 73 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f  st->iTable = pCo
d480: 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a  lumns->nId;.  }.
d490: 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65  .vector_append_e
d4a0: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45  rror:.  sqlite3E
d4b0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
d4c0: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  xpr);.  sqlite3I
d4d0: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
d4e0: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74  pColumns);.  ret
d4f0: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
d500: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74  .** Set the sort
d510: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c   order for the l
d520: 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74  ast element on t
d530: 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73  he given ExprLis
d540: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d550: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72  e3ExprListSetSor
d560: 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20  tOrder(ExprList 
d570: 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64  *p, int iSortOrd
d580: 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  er){.  if( p==0 
d590: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
d5a0: 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  rt( SQLITE_SO_UN
d5b0: 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c  DEFINED<0 && SQL
d5c0: 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26  ITE_SO_ASC>=0 &&
d5d0: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e   SQLITE_SO_DESC>
d5e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
d5f0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69  ->nExpr>0 );.  i
d600: 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20  f( iSortOrder<0 
d610: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d620: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
d630: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
d640: 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20  E_SO_ASC );.    
d650: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d  return;.  }.  p-
d660: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
d670: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69  ortOrder = (u8)i
d680: 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a  SortOrder;.}../*
d690: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
d6a0: 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65  List.a[].zName e
d6b0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
d6c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
d6d0: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
d6e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d6f0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
d700: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
d710: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
d720: 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73  or.  But pName s
d730: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
d740: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
d750: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
d760: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
d770: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
d780: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
d790: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
d7a0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
d7b0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
d7c0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
d7d0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d7e0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d7f0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
d800: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
d810: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
d820: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
d830: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
d840: 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64  Name to be added
d850: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
d860: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
d870: 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74   True to cause t
d880: 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65  he name to be de
d890: 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  quoted */.){.  a
d8a0: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
d8b0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
d8c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
d8d0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
d8e0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
d8f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
d900: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
d910: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
d920: 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69      pItem = &pLi
d930: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
d940: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
d950: 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d  t( pItem->zName=
d960: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
d970: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
d980: 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65  DbStrNDup(pParse
d990: 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ->db, pName->z, 
d9a0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
d9b0: 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c  f( dequote ) sql
d9c0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65  ite3Dequote(pIte
d9d0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  m->zName);.  }.}
d9e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
d9f0: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70  ExprList.a[].zSp
da00: 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  an element of th
da10: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
da20: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
da30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
da40: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
da50: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
da60: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
da70: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70   error.  But pSp
da80: 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  an should never 
da90: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
daa0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
dab0: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
dac0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
dad0: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
dae0: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
daf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
db00: 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20  etSpan(.  Parse 
db10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
db20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
db30: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
db40: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
db50: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
db60: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
db70: 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  an. */.  const c
db80: 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20  har *zStart,    
db90: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65   /* Start of the
dba0: 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74   span */.  const
dbb0: 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20   char *zEnd     
dbc0: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
dbd0: 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71   span */.){.  sq
dbe0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
dbf0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
dc00: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
dc10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
dc20: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
dc30: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
dc40: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
dc50: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
dc60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
dc70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
dc80: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
dc90: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
dca0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
dcb0: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  n);.    pItem->z
dcc0: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
dcd0: 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61  SpanDup(db, zSta
dce0: 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a 7d  rt, zEnd);.  }.}
dcf0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
dd00: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
dd10: 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d  EList contains m
dd20: 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20  ore than iLimit 
dd30: 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61  elements,.** lea
dd40: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
dd50: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
dd60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
dd70: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
dd80: 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  h(.  Parse *pPar
dd90: 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
dda0: 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20  pEList,.  const 
ddb0: 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b  char *zObject.){
ddc0: 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72  .  int mx = pPar
ddd0: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
dde0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
ddf0: 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  MN];.  testcase(
de00: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
de10: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a  t->nExpr==mx );.
de20: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
de30: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
de40: 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69  xpr==mx+1 );.  i
de50: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
de60: 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b  ist->nExpr>mx ){
de70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
de80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
de90: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
dea0: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
deb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
dec0: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65  lete an entire e
ded0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
dee0: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
def0: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65  _NOINLINE void e
df00: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
df10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
df20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
df30: 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e   int i = pList->
df40: 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20  nExpr;.  struct 
df50: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
df60: 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61  Item =  pList->a
df70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
df80: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
df90: 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  do{.    sqlite3E
dfa0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
dfb0: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
dfc0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
dfd0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
dfe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
dff0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e000: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
e010: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d  ++;.  }while( --
e020: 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  i>0 );.  sqlite3
e030: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
e040: 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  st);.}.void sqli
e050: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
e060: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
e070: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
e080: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 65  .  if( pList ) e
e090: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
e0a0: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
e0b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
e0c0: 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c  bitwise-OR of al
e0d0: 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65  l Expr.flags fie
e0e0: 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e  lds in the given
e0f0: 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  .** ExprList..*/
e100: 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70 72  .u32 sqlite3Expr
e110: 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20  ListFlags(const 
e120: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e130: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32  {.  int i;.  u32
e140: 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74   m = 0;.  assert
e150: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
e160: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
e170: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
e180: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
e190: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
e1a0: 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72 74  xpr;.     assert
e1b0: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
e1c0: 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66     m |= pExpr->f
e1d0: 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75  lags;.  }.  retu
e1e0: 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn m;.}../*.** T
e1f0: 68 69 73 20 69 73 20 61 20 53 45 4c 45 43 54 2d  his is a SELECT-
e200: 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f  node callback fo
e210: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
e220: 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20   walker that.** 
e230: 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e 20  always "fails". 
e240: 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74 68   By "fail" in th
e250: 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61 6e  is case, we mean
e260: 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d   set.** pWalker-
e270: 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61  >eCode to zero a
e280: 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20  nd abort..**.** 
e290: 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73  This callback is
e2a0: 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70 6c   used by multipl
e2b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c  e expression wal
e2c0: 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  kers..*/.int sql
e2d0: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
e2e0: 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  il(Walker *pWalk
e2f0: 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  er, Select *NotU
e300: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
e310: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
e320: 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  );.  pWalker->eC
e330: 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ode = 0;.  retur
e340: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a  n WRC_Abort;.}..
e350: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
e360: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ut expression is
e370: 20 61 6e 20 49 44 20 77 69 74 68 20 74 68 65 20   an ID with the 
e380: 6e 61 6d 65 20 22 74 72 75 65 22 20 6f 72 20 22  name "true" or "
e390: 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20 63  false".** then c
e3a0: 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61  onvert it into a
e3b0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 54 4b  n appropriate TK
e3c0: 5f 54 52 55 45 46 41 4c 53 45 20 74 65 72 6d 2e  _TRUEFALSE term.
e3d0: 20 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a    Return true.**
e3e0: 20 69 66 20 61 20 63 6f 6e 76 65 72 73 69 6f 6e   if a conversion
e3f0: 20 6f 63 63 75 72 72 65 64 2c 20 61 6e 64 20 66   occurred, and f
e400: 61 6c 73 65 20 69 66 20 74 68 65 20 65 78 70 72  alse if the expr
e410: 65 73 73 69 6f 6e 20 69 73 20 75 6e 61 6c 74 65  ession is unalte
e420: 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
e430: 74 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46  te3ExprIdToTrueF
e440: 61 6c 73 65 28 45 78 70 72 20 2a 70 45 78 70 72  alse(Expr *pExpr
e450: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ){.  assert( pEx
e460: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c  pr->op==TK_ID ||
e470: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
e480: 54 52 49 4e 47 20 29 3b 0a 20 20 69 66 28 20 73  TRING );.  if( s
e490: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
e4a0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22  xpr->u.zToken, "
e4b0: 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 7c 7c 20  true")==0.   || 
e4c0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
e4d0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
e4e0: 22 66 61 6c 73 65 22 29 3d 3d 30 0a 20 20 29 7b  "false")==0.  ){
e4f0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
e500: 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3b 0a 20   TK_TRUEFALSE;. 
e510: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
e520: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e530: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
e540: 6e 74 20 69 73 20 6f 6e 65 20 6f 66 20 61 20 54  nt is one of a T
e550: 4b 5f 54 52 55 45 46 41 4c 53 45 20 74 65 72 6d  K_TRUEFALSE term
e560: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 69  .  Return 1 if i
e570: 74 20 69 73 20 54 52 55 45 0a 2a 2a 20 61 6e 64  t is TRUE.** and
e580: 20 30 20 69 66 20 69 74 20 69 73 20 46 41 4c 53   0 if it is FALS
e590: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
e5a0: 33 45 78 70 72 54 72 75 74 68 4f 70 65 72 61 6e  3ExprTruthOperan
e5b0: 64 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45  d(const Expr *pE
e5c0: 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  xpr){.  assert( 
e5d0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 54 52  pExpr->op==TK_TR
e5e0: 55 45 46 41 4c 53 45 20 29 3b 0a 20 20 61 73 73  UEFALSE );.  ass
e5f0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 49  ert( sqlite3StrI
e600: 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
e610: 6b 65 6e 2c 22 74 72 75 65 22 29 3d 3d 30 0a 20  ken,"true")==0. 
e620: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
e630: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
e640: 2e 7a 54 6f 6b 65 6e 2c 22 66 61 6c 73 65 22 29  .zToken,"false")
e650: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
e660: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
e670: 34 5d 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  4]==0;.}.../*.**
e680: 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
e690: 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  are Walker callb
e6a0: 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65  acks used to che
e6b0: 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ck expressions t
e6c0: 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79  o.** see if they
e6d0: 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20   are "constant" 
e6e0: 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74  for some definit
e6f0: 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e  ion of constant.
e700: 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e    The.** Walker.
e710: 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65  eCode value dete
e720: 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65 20  rmines the type 
e730: 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65  of "constant" we
e740: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20   are looking.** 
e750: 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  for..**.** These
e760: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
e770: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69  es are used to i
e780: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c  mplement the fol
e790: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
e7a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
e7b0: 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20  onstant()       
e7c0: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
e7d0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20  er->eCode==1.** 
e7e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
e7f0: 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
e800: 28 29 20 20 20 20 20 20 20 20 20 20 20 70 57 61  ()           pWa
e810: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a  lker->eCode==2.*
e820: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
e830: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
e840: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ()             p
e850: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33  Walker->eCode==3
e860: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
e870: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
e880: 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20  unction()       
e890: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
e8a0: 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e  =4 or 5.**.** In
e8b0: 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20   all cases, the 
e8c0: 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61  callbacks set Wa
e8d0: 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64  lker.eCode=0 and
e8e0: 20 61 62 6f 72 74 20 69 66 20 74 68 65 20 65 78   abort if the ex
e8f0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66  pression.** is f
e900: 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61  ound to not be a
e910: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a   constant..**.**
e920: 20 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72   The sqlite3Expr
e930: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
e940: 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66  tion() is used f
e950: 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78  or evaluating ex
e960: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20  pressions.** in 
e970: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
e980: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57  tatement.  The W
e990: 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75  alker.eCode valu
e9a0: 65 20 69 73 20 35 20 77 68 65 6e 20 70 61 72 73  e is 5 when pars
e9b0: 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69  ing.** an existi
e9c0: 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20  ng schema and 4 
e9d0: 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  when processing 
e9e0: 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e  a new statement.
e9f0: 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72    A bound.** par
ea00: 61 6d 65 74 65 72 20 72 61 69 73 65 73 20 61 6e  ameter raises an
ea10: 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73   error for new s
ea20: 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69  tatements, but i
ea30: 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65  s silently conve
ea40: 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20  rted.** to NULL 
ea50: 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73 63 68  for existing sch
ea60: 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f  emas.  This allo
ea70: 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ws sqlite_master
ea80: 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a   tables that .**
ea90: 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64   contain a bound
eaa0: 20 70 61 72 61 6d 65 74 65 72 20 62 65 63 61 75   parameter becau
eab0: 73 65 20 74 68 65 79 20 77 65 72 65 20 67 65 6e  se they were gen
eac0: 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20  erated by older 
ead0: 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53  versions.** of S
eae0: 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61 72 73  QLite to be pars
eaf0: 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73  ed by newer vers
eb00: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77  ions of SQLite w
eb10: 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61  ithout raising a
eb20: 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63  .** malformed sc
eb30: 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  hema error..*/.s
eb40: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
eb50: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c  deIsConstant(Wal
eb60: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
eb70: 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f  pr *pExpr){..  /
eb80: 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43  * If pWalker->eC
eb90: 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e  ode is 2 then an
eba0: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78  y term of the ex
ebb0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
ebc0: 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mes from.  ** th
ebd0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
ebe0: 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20  auses of a left 
ebf0: 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65  join disqualifie
ec00: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
ec10: 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67  .  ** from being
ec20: 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73   considered cons
ec30: 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tant. */.  if( p
ec40: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
ec50: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
ec60: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
ec70: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70  omJoin) ){.    p
ec80: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
ec90: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  0;.    return WR
eca0: 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
ecb0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
ecc0: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73  p ){.    /* Cons
ecd0: 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  ider functions t
ece0: 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66  o be constant if
ecf0: 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d   all their argum
ed00: 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e  ents are constan
ed10: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74  t.    ** and eit
ed20: 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  her pWalker->eCo
ed30: 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68  de==4 or 5 or th
ed40: 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  e function has t
ed50: 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  he.    ** SQLITE
ed60: 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67  _FUNC_CONST flag
ed70: 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  . */.    case TK
ed80: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
ed90: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
eda0: 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61  ode>=4 || ExprHa
edb0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
edc0: 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b  EP_ConstFunc) ){
edd0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ede0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
edf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ee00: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
ee10: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
ee20: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
ee30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73  .      }.    cas
ee40: 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 20 20 2f  e TK_ID:.      /
ee50: 2a 20 43 6f 6e 76 65 72 74 20 22 74 72 75 65 22  * Convert "true"
ee60: 20 6f 72 20 22 66 61 6c 73 65 22 20 69 6e 20 61   or "false" in a
ee70: 20 44 45 46 41 55 4c 54 20 63 6c 61 75 73 65 20   DEFAULT clause 
ee80: 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  into the.      *
ee90: 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 54 4b  * appropriate TK
eea0: 5f 54 52 55 45 46 41 4c 53 45 20 6f 70 65 72 61  _TRUEFALSE opera
eeb0: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  tor */.      if(
eec0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e   pWalker->eCode>
eed0: 3d 34 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  =4 && sqlite3Exp
eee0: 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 70  rIdToTrueFalse(p
eef0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
ef00: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
ef10: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
ef20: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
ef30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
ef40: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
ef50: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
ef60: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
ef70: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73  OLUMN:.      tes
ef80: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
ef90: 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20  ==TK_ID );.     
efa0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
efb0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
efc0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
efd0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
efe0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
eff0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f000: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
f010: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
f020: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
f030: 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78 70  eCode==3 && pExp
f040: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
f050: 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20  er->u.iCur ){.  
f060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f070: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
f080: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
f090: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
f0a0: 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  case TK_IF_NULL_
f0b0: 52 4f 57 3a 0a 20 20 20 20 20 20 74 65 73 74 63  ROW:.      testc
f0c0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
f0d0: 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29  TK_IF_NULL_ROW )
f0e0: 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d  ;.      pWalker-
f0f0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
f100: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
f110: 72 74 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  rt;.    case TK_
f120: 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
f130: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
f140: 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  de==5 ){.       
f150: 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e   /* Silently con
f160: 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61 6d  vert bound param
f170: 65 74 65 72 73 20 74 68 61 74 20 61 70 70 65 61  eters that appea
f180: 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45 41  r inside of CREA
f190: 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  TE.        ** st
f1a0: 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20  atements into a 
f1b0: 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69 6e  NULL when parsin
f1c0: 67 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  g the CREATE sta
f1d0: 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74 0a  tement text out.
f1e0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
f1f0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f200: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
f210: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
f220: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  NULL;.      }els
f230: 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65  e if( pWalker->e
f240: 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20  Code==4 ){.     
f250: 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61     /* A bound pa
f260: 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52 45  rameter in a CRE
f270: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ATE statement th
f280: 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
f290: 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71  om.        ** sq
f2a0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
f2b0: 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72 20  causes an error 
f2c0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  */.        pWalk
f2d0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
f2e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
f2f0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
f300: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
f310: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64 65  hrough */.    de
f320: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73  fault:.      tes
f330: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
f340: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f  ==TK_SELECT ); /
f350: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  * sqlite3SelectW
f360: 61 6c 6b 46 61 69 6c 20 77 69 6c 6c 20 64 69 73  alkFail will dis
f370: 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74  allow */.      t
f380: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
f390: 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
f3a0: 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63   /* sqlite3Selec
f3b0: 74 57 61 6c 6b 46 61 69 6c 20 77 69 6c 6c 20 64  tWalkFail will d
f3c0: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
f3d0: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
f3e0: 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  inue;.  }.}.stat
f3f0: 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e  ic int exprIsCon
f400: 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  st(Expr *p, int 
f410: 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43  initFlag, int iC
f420: 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ur){.  Walker w;
f430: 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69  .  w.eCode = ini
f440: 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72  tFlag;.  w.xExpr
f450: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
f460: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
f470: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
f480: 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ck = sqlite3Sele
f490: 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64  ctWalkFail;.#ifd
f4a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
f4b0: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
f4c0: 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65  ack2 = sqlite3Se
f4d0: 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b  lectWalkAssert2;
f4e0: 0a 23 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43  .#endif.  w.u.iC
f4f0: 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c  ur = iCur;.  sql
f500: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
f510: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
f520: 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
f530: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
f540: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
f550: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
f560: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
f570: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
f580: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
f590: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
f5a0: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
f5b0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
f5c0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
f5d0: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
f5e0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
f5f0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
f600: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
f610: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
f620: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
f630: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
f640: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
f650: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
f660: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
f670: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
f680: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20  prIsConst(p, 1, 
f690: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
f6a0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
f6b0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
f6c0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
f6d0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
f6e0: 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65  tant.** that doe
f6f0: 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66  s no originate f
f700: 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
f710: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
f720: 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e   join..** Return
f730: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
f740: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
f750: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72  unction calls or
f760: 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61   terms from.** a
f770: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
f780: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
f790: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
f7a0: 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a  ntNotJoin(Expr *
f7b0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
f7c0: 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30  rIsConst(p, 2, 0
f7d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
f7e0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
f7f0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
f800: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
f810: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
f820: 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73  ant.** for any s
f830: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
f840: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
f850: 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68  or iCur.  In oth
f860: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a  er words, the.**
f870: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
f880: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e   not refer to an
f890: 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  y non-determinis
f8a0: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  tic function nor
f8b0: 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74   any.** table ot
f8c0: 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a  her than iCur..*
f8d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f8e0: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
f8f0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43  (Expr *p, int iC
f900: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  ur){.  return ex
f910: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20  prIsConst(p, 3, 
f920: 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  iCur);.}.../*.**
f930: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
f940: 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  () callback used
f950: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 49   by sqlite3ExprI
f960: 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
f970: 42 79 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  By()..*/.static 
f980: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
f990: 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28  nstantOrGroupBy(
f9a0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
f9b0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
f9c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
f9d0: 70 42 79 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pBy = pWalker->u
f9e0: 2e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 6e 74  .pGroupBy;.  int
f9f0: 20 69 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   i;..  /* Check 
fa00: 69 66 20 70 45 78 70 72 20 69 73 20 69 64 65 6e  if pExpr is iden
fa10: 74 69 63 61 6c 20 74 6f 20 61 6e 79 20 47 52 4f  tical to any GRO
fa20: 55 50 20 42 59 20 74 65 72 6d 2e 20 49 66 20 73  UP BY term. If s
fa30: 6f 2c 20 63 6f 6e 73 69 64 65 72 0a 20 20 2a 2a  o, consider.  **
fa40: 20 69 74 20 63 6f 6e 73 74 61 6e 74 2e 20 20 2a   it constant.  *
fa50: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
fa60: 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
fa70: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
fa80: 70 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  p = pGroupBy->a[
fa90: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
faa0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
fab0: 70 61 72 65 28 30 2c 20 70 45 78 70 72 2c 20 70  pare(0, pExpr, p
fac0: 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20  , -1)<2 ){.     
fad0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
fae0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43  = sqlite3ExprNNC
faf0: 6f 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72 2d 3e  ollSeq(pWalker->
fb00: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
fb10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
fb20: 72 69 63 6d 70 28 22 42 49 4e 41 52 59 22 2c 20  ricmp("BINARY", 
fb30: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  pColl->zName)==0
fb40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
fb50: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
fb60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
fb70: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70  .  /* Check if p
fb80: 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65  Expr is a sub-se
fb90: 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e  lect. If so, con
fba0: 73 69 64 65 72 20 69 74 20 76 61 72 69 61 62 6c  sider it variabl
fbb0: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72  e. */.  if( Expr
fbc0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
fbd0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
fbe0: 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
fbf0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
fc00: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
fc10: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
fc20: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
fc30: 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70  nt(pWalker, pExp
fc40: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  r);.}../*.** Wal
fc50: 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  k the expression
fc60: 20 74 72 65 65 20 70 61 73 73 65 64 20 61 73 20   tree passed as 
fc70: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
fc80: 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  nt. Return non-z
fc90: 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65 78  ero.** if the ex
fca0: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74  pression consist
fcb0: 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f  s entirely of co
fcc0: 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69 65  nstants or copie
fcd0: 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69  s of terms .** i
fce0: 6e 20 70 47 72 6f 75 70 42 79 20 74 68 61 74 20  n pGroupBy that 
fcf0: 73 6f 72 74 20 77 69 74 68 20 74 68 65 20 42 49  sort with the BI
fd00: 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  NARY collation s
fd10: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
fd20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
fd30: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
fd40: 20 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74 68   if a term of th
fd50: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
fd60: 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74  can.** be promot
fd70: 65 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45 52  ed into the WHER
fd80: 45 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72  E clause.  In or
fd90: 64 65 72 20 66 6f 72 20 73 75 63 68 20 61 20 70  der for such a p
fda0: 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b  romotion to work
fdb0: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
fdc0: 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  f the HAVING cla
fdd0: 75 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65  use term must be
fde0: 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c   the same for al
fdf0: 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20  l members of.** 
fe00: 61 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65 20  a "group".  The 
fe10: 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
fe20: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
fe30: 72 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41 52  rm must be BINAR
fe40: 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 61  Y.** assumes tha
fe50: 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61  t no other colla
fe60: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69  ting sequence wi
fe70: 6c 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72 2d  ll have a finer-
fe80: 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70  grained.** group
fe90: 69 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79 2e  ing than binary.
fea0: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
feb0: 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69   (A=B COLLATE bi
fec0: 6e 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a  nary) implies.**
fed0: 20 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f 74   A=B in every ot
fee0: 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  her collating se
fef0: 71 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65 71  quence.  The req
ff00: 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68  uirement that th
ff10: 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62 65  e.** GROUP BY be
ff20: 20 42 49 4e 41 52 59 20 69 73 20 73 74 72 69 63   BINARY is stric
ff30: 74 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ter than necessa
ff40: 72 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61 6c  ry.  It would al
ff50: 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72  so work.** to pr
ff60: 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c 61  omote HAVING cla
ff70: 75 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  uses that use th
ff80: 65 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74 69  e same alternati
ff90: 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  ve collating.** 
ffa0: 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20  sequence as the 
ffb0: 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20 62  GROUP BY term, b
ffc0: 75 74 20 74 68 61 74 20 69 73 20 6d 75 63 68 20  ut that is much 
ffd0: 68 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b 2c  harder to check,
ffe0: 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20  .** alternative 
fff0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10000 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e  ces are uncommon
10010 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f 6e  , and this is on
10020 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ly an.** optimiz
10030 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b  ation, so we tak
10040 65 20 74 68 65 20 65 61 73 79 20 77 61 79 20 6f  e the easy way o
10050 75 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72 65  ut and simply re
10060 71 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f  quire the.** GRO
10070 55 50 20 42 59 20 74 6f 20 75 73 65 20 74 68 65  UP BY to use the
10080 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e   BINARY collatin
10090 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69  g sequence..*/.i
100a0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
100b0 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
100c0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
100d0 20 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c 69   Expr *p, ExprLi
100e0 73 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20  st *pGroupBy){. 
100f0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65   Walker w;.  w.e
10100 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45  Code = 1;.  w.xE
10110 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
10120 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
10130 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78  OrGroupBy;.  w.x
10140 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
10150 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70   0;.  w.u.pGroup
10160 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
10170 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
10180 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
10190 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
101a0 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
101b0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
101c0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
101d0 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
101e0 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
101f0 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
10200 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
10210 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
10220 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
10230 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
10240 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
10250 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
10260 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
10270 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
10280 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
10290 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
102a0 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
102b0 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
102c0 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
102d0 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
102e0 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
102f0 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
10300 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
10310 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
10320 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38  tion(Expr *p, u8
10330 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65   isInit){.  asse
10340 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  rt( isInit==0 ||
10350 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20   isInit==1 );.  
10360 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
10370 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20  st(p, 4+isInit, 
10380 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  0);.}..#ifdef SQ
10390 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
103a0 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57  OR_HINTS./*.** W
103b0 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
103c0 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
103d0 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
103e0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ion contains a.*
103f0 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f  * subquery of so
10400 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e  me kind.  Return
10410 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20   0 if there are 
10420 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  no subqueries..*
10430 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
10440 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72  rContainsSubquer
10450 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61  y(Expr *p){.  Wa
10460 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64  lker w;.  w.eCod
10470 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
10480 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
10490 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
104a0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
104b0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
104c0 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66  ectWalkFail;.#if
104d0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
104e0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
104f0 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53  back2 = sqlite3S
10500 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32  electWalkAssert2
10510 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
10520 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
10530 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
10540 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  ode==0;.}.#endif
10550 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
10560 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
10570 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
10580 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
10590 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
105a0 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
105b0 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
105c0 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
105d0 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
105e0 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
105f0 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
10600 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
10610 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
10620 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
10630 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
10640 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
10650 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
10660 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
10670 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
10680 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
10690 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
106a0 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
106b0 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d  rc = 0;.  if( p=
106c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
106d0 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70  /* Can only happ
106e0 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20  en following on 
106f0 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  OOM */..  /* If 
10700 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
10710 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65   an integer lite
10720 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e  ral that fits in
10730 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
10740 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74  .  ** integer, t
10750 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61  hen the EP_IntVa
10760 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61  lue flag will ha
10770 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
10780 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  set */.  assert(
10790 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47   p->op!=TK_INTEG
107a0 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20  ER || (p->flags 
107b0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  & EP_IntValue)!=
107c0 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
107d0 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
107e0 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63  p->u.zToken, &rc
107f0 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  )==0 );..  if( p
10800 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
10810 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56  Value ){.    *pV
10820 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c  alue = p->u.iVal
10830 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ue;.    return 1
10840 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
10850 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
10860 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
10870 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10880 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
10890 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
108a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
108b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
108c0 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
108d0 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
108e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
108f0 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
10900 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  &v) ){.        a
10910 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37  ssert( v!=(-2147
10920 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20  483647-1) );.   
10930 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
10940 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  v;.        rc = 
10950 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
10960 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10970 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
10980 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10990 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
109a0 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72  rn FALSE if ther
109b0 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
109c0 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
109d0 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a  on can be NULL..
109e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
109f0 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65  ression might be
10a00 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
10a10 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f  expression is to
10a20 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20  o complex.** to 
10a30 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45  tell return TRUE
10a40 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
10a50 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61  outine is used a
10a60 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
10a70 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73  n, to skip OP_Is
10a80 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20  Null opcodes.** 
10a90 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61  when we know tha
10aa0 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  t a value cannot
10ab0 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65   be NULL.  Hence
10ac0 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  , a false positi
10ad0 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  ve.** (returning
10ae0 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61   TRUE when in fa
10af0 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ct the expressio
10b00 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e  n can never be N
10b10 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65  ULL) might.** be
10b20 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d   a small perform
10b30 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20  ance hit but is 
10b40 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65  otherwise harmle
10b50 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65  ss.  On the othe
10b60 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c  r.** hand, a fal
10b70 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74  se negative (ret
10b80 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65  urning FALSE whe
10b90 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75  n the result cou
10ba0 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77  ld be NULL).** w
10bb0 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
10bc0 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  t in an incorrec
10bd0 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68  t answer.  So wh
10be0 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
10bf0 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a  urn.** TRUE..*/.
10c00 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
10c10 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45  anBeNull(const E
10c20 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70  xpr *p){.  u8 op
10c30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
10c40 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
10c50 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
10c60 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
10c70 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
10c80 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
10c90 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
10ca0 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
10cb0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
10cc0 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
10cd0 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
10ce0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
10cf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
10d00 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  B:.      return 
10d10 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  0;.    case TK_C
10d20 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 72 65 74  OLUMN:.      ret
10d30 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65  urn ExprHasPrope
10d40 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e  rty(p, EP_CanBeN
10d50 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ull) ||.        
10d60 20 20 20 20 20 70 2d 3e 70 54 61 62 3d 3d 30 20       p->pTab==0 
10d70 7c 7c 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65  ||  /* Reference
10d80 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e   to column of in
10d90 64 65 78 20 6f 6e 20 65 78 70 72 65 73 73 69 6f  dex on expressio
10da0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
10db0 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30    (p->iColumn>=0
10dc0 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f   && p->pTab->aCo
10dd0 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  l[p->iColumn].no
10de0 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64  tNull==0);.    d
10df0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
10e00 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
10e10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
10e20 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
10e30 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
10e40 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75  nstant which wou
10e50 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67  ld be.** unchang
10e60 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74  ed by OP_Affinit
10e70 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e  y with the affin
10e80 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ity given in the
10e90 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
10ea0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
10eb0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
10ec0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
10ed0 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
10ee0 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  operation.** can
10ef0 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68   be omitted.  Wh
10f00 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75  en in doubt retu
10f10 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c  rn FALSE.  A fal
10f20 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69  se negative.** i
10f30 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66  s harmless.  A f
10f40 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68  alse positive, h
10f50 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75  owever, can resu
10f60 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a  lt in the wrong.
10f70 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e  ** answer..*/.in
10f80 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  t sqlite3ExprNee
10f90 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
10fa0 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ge(const Expr *p
10fb0 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75  , char aff){.  u
10fc0 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d  8 op;.  if( aff=
10fd0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
10fe0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77   ) return 1;.  w
10ff0 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
11000 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
11010 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
11020 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
11030 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
11040 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
11050 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
11060 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
11070 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
11080 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  GER: {.      ret
11090 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
110a0 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
110b0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
110c0 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
110d0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
110e0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
110f0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11100 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  REAL || aff==SQL
11110 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
11120 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11130 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
11140 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
11150 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
11160 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11170 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
11180 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
11190 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
111a0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
111b0 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
111c0 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
111d0 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
111e0 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
111f0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  /.      return p
11200 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20  ->iColumn<0.    
11210 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
11220 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
11230 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
11240 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20  _AFF_NUMERIC);. 
11250 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
11260 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
11270 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
11280 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
11290 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
112a0 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
112b0 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
112c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
112d0 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
112e0 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
112f0 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
11300 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
11310 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
11320 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
11330 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
11340 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
11350 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
11360 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
11370 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
11380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73  ;.}../*.** pX is
11390 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49   the RHS of an I
113a0 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  N operator.  If 
113b0 70 58 20 69 73 20 61 20 53 45 4c 45 43 54 20 73  pX is a SELECT s
113c0 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61  tatement .** tha
113d0 74 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66  t can be simplif
113e0 69 65 64 20 74 6f 20 61 20 64 69 72 65 63 74 20  ied to a direct 
113f0 74 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68  table access, th
11400 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70  en return.** a p
11410 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45  ointer to the SE
11420 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
11430 20 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20   If pX is not a 
11440 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11450 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53  ,.** or if the S
11460 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11470 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69  needs to be mani
11480 66 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72  fested into a tr
11490 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65  ansient.** table
114a0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55  , then return NU
114b0 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  LL..*/.#ifndef S
114c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
114d0 45 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63  ERY.static Selec
114e0 74 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f  t *isCandidateFo
114f0 72 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29  rInOpt(Expr *pX)
11500 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20  {.  Select *p;. 
11510 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
11520 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
11530 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
11540 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  b;.  int i;.  if
11550 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
11560 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
11570 65 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ect) ) return 0;
11580 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71 75    /* Not a subqu
11590 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 45 78 70  ery */.  if( Exp
115a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
115b0 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 20   EP_VarSelect)  
115c0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
115d0 43 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 20  Correlated subq 
115e0 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70  */.  p = pX->x.p
115f0 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 2d  Select;.  if( p-
11600 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  >pPrior ) return
11610 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11620 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75   /* Not a compou
11630 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  nd SELECT */.  i
11640 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
11650 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
11660 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20  _Aggregate) ){. 
11670 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
11680 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
11690 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
116a0 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
116b0 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74  inct );.    test
116c0 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
116d0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
116e0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
116f0 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
11700 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  ;.    return 0; 
11710 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b  /* No DISTINCT k
11720 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67  eyword and no ag
11730 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
11740 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72  s */.  }.  asser
11750 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
11760 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
11770 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55    /* Has no GROU
11780 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
11790 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
117a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
117b0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
117c0 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a  o LIMIT clause *
117d0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  /.  if( p->pWher
117e0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
117f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
11800 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
11810 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d  e */.  pSrc = p-
11820 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
11830 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66   pSrc!=0 );.  if
11840 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
11850 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
11860 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74       /* Single t
11870 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  erm in FROM clau
11880 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  se */.  if( pSrc
11890 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
118a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f   return 0;     /
118b0 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20  * FROM is not a 
118c0 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77  subquery or view
118d0 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72   */.  pTab = pSr
118e0 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
118f0 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
11900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
11910 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  b->pSelect==0 );
11920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11930 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
11940 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66  t a view */.  if
11950 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
11960 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  ) ) return 0;   
11970 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
11980 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61  use not a virtua
11990 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c  l table */.  pEL
119a0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
119b0 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
119c0 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c  t!=0 );.  /* All
119d0 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
119e0 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e  must be columns.
119f0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
11a00 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
11a10 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
11a20 70 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pRes = pEList->a
11a30 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
11a40 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f  f( pRes->op!=TK_
11a50 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
11a60 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
11a70 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  Res->iTable==pSr
11a80 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20  c->a[0].iCursor 
11a90 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72  );  /* Not a cor
11aa0 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
11ab0 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
11ac0 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   p;.}.#endif /* 
11ad0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
11ae0 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
11af0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
11b00 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
11b10 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63  rate code that c
11b20 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d  hecks the left-m
11b30 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  ost column of in
11b40 64 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74  dex table iCur t
11b50 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63  o see if.** it c
11b60 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
11b70 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65   entries.  Cause
11b80 20 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74   the register at
11b90 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62   regHasNull to b
11ba0 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  e set.** to a no
11bb0 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20  n-NULL value if 
11bc0 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  iCur contains no
11bd0 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72   NULLs.  Cause r
11be0 65 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75  egister regHasNu
11bf0 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20  ll.** to be set 
11c00 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20  to NULL if iCur 
11c10 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
11c20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
11c30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c40 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
11c50 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20  llFlag(Vdbe *v, 
11c60 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65  int iCur, int re
11c70 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74  gHasNull){.  int
11c80 20 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65   addr1;.  sqlite
11c90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11ca0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
11cb0 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64  gHasNull);.  add
11cc0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
11cd0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
11ce0 69 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65  ind, iCur); Vdbe
11cf0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
11d00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11d10 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
11d20 43 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75  Cur, 0, regHasNu
11d30 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ll);.  sqlite3Vd
11d40 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
11d50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
11d60 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
11d70 76 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f  v, "first_entry_
11d80 69 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b  in(%d)", iCur));
11d90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
11da0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
11db0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
11dc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11dd0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
11de0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
11df0 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
11e00 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20  ith a list (not 
11e10 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74  a subquery) on t
11e20 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e  he .** right-han
11e30 64 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20  d side.  Return 
11e40 54 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73  TRUE if that lis
11e50 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  t is constant..*
11e60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
11e70 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74  ite3InRhsIsConst
11e80 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a  ant(Expr *pIn){.
11e90 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20    Expr *pLHS;.  
11ea0 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72  int res;.  asser
11eb0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
11ec0 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53  rty(pIn, EP_xIsS
11ed0 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53  elect) );.  pLHS
11ee0 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20   = pIn->pLeft;. 
11ef0 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b   pIn->pLeft = 0;
11f00 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  .  res = sqlite3
11f10 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
11f20 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66  In);.  pIn->pLef
11f30 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75  t = pLHS;.  retu
11f40 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66  rn res;.}.#endif
11f50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11f60 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ction is used by
11f70 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
11f80 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e  ion of the IN (.
11f90 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ..) operator..**
11fa0 20 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65   The pX paramete
11fb0 72 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73  r is the express
11fc0 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ion on the RHS o
11fd0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
11fe0 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68  r, which.** migh
11ff0 74 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69  t be either a li
12000 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
12010 73 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  s or a subquery.
12020 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f  .**.** The job o
12030 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
12040 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65  s to find or cre
12050 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a  ate a b-tree obj
12060 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20  ect that can.** 
12070 62 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74  be used either t
12080 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65  o test for membe
12090 72 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53  rship in the RHS
120a0 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61   set or to itera
120b0 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c  te through.** al
120c0 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65  l members of the
120d0 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69   RHS set, skippi
120e0 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a  ng duplicates..*
120f0 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73  *.** A cursor is
12100 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62   opened on the b
12110 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  -tree object tha
12120 74 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20  t is the RHS of 
12130 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
12140 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c  ** and pX->iTabl
12150 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
12160 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75  index of that cu
12170 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
12180 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f  returned value o
12190 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
121a0 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d  indicates the b-
121b0 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f  tree type, as fo
121c0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49  llows:.**.**   I
121d0 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20  N_INDEX_ROWID   
121e0 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20     - The cursor 
121f0 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
12200 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
12210 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
12220 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63  DEX_ASC  - The c
12230 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
12240 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
12250 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
12260 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
12270 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
12280 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65  s opened on a de
12290 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a  scending index..
122a0 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50  **   IN_INDEX_EP
122b0 48 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63  H        - The c
122c0 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
122d0 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20   on a specially 
122e0 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20  created and.**  
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64         populated
12310 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
12320 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
12330 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20  NOOP       - No 
12340 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63  cursor was alloc
12350 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70  ated.  The IN op
12360 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a  erator must be.*
12370 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12380 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d            implem
12390 65 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65  ented as a seque
123a0 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  nce of compariso
123b0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  ns..**.** An exi
123c0 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67  sting b-tree mig
123d0 68 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ht be used if th
123e0 65 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e  e RHS expression
123f0 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a   pX is a simple.
12400 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68  ** subquery such
12410 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53   as:.**.**     S
12420 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c  ELECT <column1>,
12430 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52   <column2>... FR
12440 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
12450 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
12460 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
12470 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f  s a list or a mo
12480 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75  re complex subqu
12490 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20  ery, then.** an 
124a0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
124b0 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
124c0 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
124d0 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e  the RHS and then
124e0 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d  .** pX->iTable m
124f0 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
12500 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
12510 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
12520 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61  n.** existing ta
12530 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ble..**.** The i
12540 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  nFlags parameter
12550 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 2c 20 61   must contain, a
12560 74 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 6f 6e 65  t a minimum, one
12570 20 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20   of the bits.** 
12580 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
12590 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f  HIP or IN_INDEX_
125a0 4c 4f 4f 50 20 62 75 74 20 6e 6f 74 20 62 6f 74  LOOP but not bot
125b0 68 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63  h.  If inFlags c
125c0 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e  ontains.** IN_IN
125d0 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20  DEX_MEMBERSHIP, 
125e0 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74  then the generat
125f0 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  ed table will be
12600 20 75 73 65 64 20 66 6f 72 20 61 20 66 61 73 74   used for a fast
12610 0a 2a 2a 20 6d 65 6d 62 65 72 73 68 69 70 20 74  .** membership t
12620 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49  est.  When the I
12630 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74  N_INDEX_LOOP bit
12640 20 69 73 20 73 65 74 2c 20 74 68 65 20 49 4e 20   is set, the IN 
12650 69 6e 64 65 78 20 77 69 6c 6c 0a 2a 2a 20 62 65  index will.** be
12660 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76   used to loop ov
12670 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
12680 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
12690 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  IN operator..**.
126a0 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58  ** When IN_INDEX
126b0 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61  _LOOP is used (a
126c0 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  nd the b-tree wi
126d0 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ll be used to it
126e0 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68  erate.** through
126f0 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73   the set members
12700 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65  ) then the b-tre
12710 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61  e must not conta
12720 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a  in duplicates..*
12730 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  * An epheremal t
12740 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 63 72 65  able will be cre
12750 61 74 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20  ated unless the 
12760 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73  selected columns
12770 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a   are guaranteed.
12780 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20  ** to be unique 
12790 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  - either because
127a0 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45   it is an INTEGE
127b0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
127c0 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49   due to.** a UNI
127d0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
127e0 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57  r index..**.** W
127f0 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  hen IN_INDEX_MEM
12800 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20  BERSHIP is used 
12810 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
12820 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
12830 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65   for fast set me
12840 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20  mbership tests) 
12850 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61  then an epherema
12860 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a  l table must .**
12870 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
12880 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73  <columns> is a s
12890 69 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52  ingle INTEGER PR
128a0 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
128b0 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78   or an .** index
128c0 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69   can be found wi
128d0 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
128e0 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74   <columns> as it
128f0 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a  s left-most..**.
12900 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44  ** If the IN_IND
12910 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49  EX_NOOP_OK and I
12920 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
12930 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20  IP are both set 
12940 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48  and.** if the RH
12950 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
12960 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28  ator is a list (
12970 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
12980 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
12990 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64  tine might decid
129a0 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20  e that creating 
129b0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74  an ephemeral b-t
129c0 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  ree for membersh
129d0 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73  ip.** testing is
129e0 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61   too expensive a
129f0 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  nd return IN_IND
12a00 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61  EX_NOOP.  In tha
12a10 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63  t case, the.** c
12a20 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73  alling routine s
12a30 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20  hould implement 
12a40 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
12a50 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65  using a sequence
12a60 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20  .** of Eq or Ne 
12a70 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
12a80 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tions..**.** Whe
12a90 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  n the b-tree is 
12aa0 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d  being used for m
12ab0 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c  embership tests,
12ac0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
12ad0 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e  ction.** might n
12ae0 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74  eed to know whet
12af0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52  her or not the R
12b00 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  HS side of the I
12b10 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f  N operator.** co
12b20 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20  ntains a NULL.  
12b30 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  If prRhsHasNull 
12b40 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f  is not a NULL po
12b50 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66  inter and .** if
12b60 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68   there is any ch
12b70 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
12b80 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  ..) might contai
12b90 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61  n a NULL value a
12ba0 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68  t.** runtime, th
12bb0 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73  en a register is
12bc0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
12bd0 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
12be0 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  er written.** to
12bf0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20   *prRhsHasNull. 
12c00 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  If there is no c
12c10 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
12c20 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a  ...) contains a.
12c30 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74  ** NULL value, t
12c40 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  hen *prRhsHasNul
12c50 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  l is left unchan
12c60 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ged..**.** If a 
12c70 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
12c80 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f  cated and its lo
12c90 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e  cation stored in
12ca0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
12cb0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75  then.** the valu
12cc0 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74  e in that regist
12cd0 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  er will be NULL 
12ce0 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
12cf0 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
12d00 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  re.** NULL value
12d10 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62  s, and it will b
12d20 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20  e some non-NULL 
12d30 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74  value if the b-t
12d40 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a  ree contains no.
12d50 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  ** NULL values..
12d60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d  **.** If the aiM
12d70 61 70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ap parameter is 
12d80 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73  not NULL, it mus
12d90 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72  t point to an ar
12da0 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ray containing.*
12db0 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f  * one element fo
12dc0 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65  r each column re
12dd0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
12de0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
12df0 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20  n the RHS.** of 
12e00 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72  the IN(...) oper
12e10 61 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65  ator. The i'th e
12e20 6e 74 72 79 20 6f 66 20 74 68 65 20 61 72 72 61  ntry of the arra
12e30 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  y is populated w
12e40 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65  ith the.** offse
12e50 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63  t of the index c
12e60 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68  olumn that match
12e70 65 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  es the i'th colu
12e80 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  mn returned by t
12e90 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f  he.** SELECT. Fo
12ea0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
12eb0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
12ec0 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20   selected index 
12ed0 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c  are:.**.**   (?,
12ee0 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20  ?,?) IN (SELECT 
12ef0 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29  a, b, c FROM t1)
12f00 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
12f10 45 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63  EX i1 ON t1(b, c
12f20 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , a);.**.** then
12f30 20 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75   aiMap[] is popu
12f40 6c 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30  lated with {2, 0
12f50 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  , 1}..*/.#ifndef
12f60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
12f70 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
12f80 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20  3FindInIndex(.  
12f90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
12fb0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
12fc0 0a 20 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20  .  Expr *pX,    
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12fe0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
12ff0 73 69 64 65 20 28 52 48 53 29 20 6f 66 20 74 68  side (RHS) of th
13000 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
13010 0a 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20  .  u32 inFlags, 
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13030 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20   IN_INDEX_LOOP, 
13040 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64  _MEMBERSHIP, and
13050 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a  /or _NOOP_OK */.
13060 20 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e    int *prRhsHasN
13070 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ull,         /* 
13080 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
13090 20 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53   NULL status.  S
130a0 65 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e  ee notes */.  in
130b0 74 20 2a 61 69 4d 61 70 20 20 20 20 20 20 20 20  t *aiMap        
130c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70           /* Mapp
130d0 69 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66  ing from Index f
130e0 69 65 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65  ields to RHS fie
130f0 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  lds */.){.  Sele
13100 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ct *p;          
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13120 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74    /* SELECT to t
13130 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f  he right of IN o
13140 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
13150 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20   eType = 0;     
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13170 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48     /* Type of RH
13180 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45  S table. IN_INDE
13190 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  X_* */.  int iTa
131a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
131b0 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ++;            /
131c0 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20  * Cursor of the 
131d0 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  RHS table */.  i
131e0 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b  nt mustBeUnique;
131f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13200 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13210 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71  RHS must be uniq
13220 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ue */.  Vdbe *v 
13230 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13240 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
13250 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   Virtual machine
13260 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
13270 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f  .  assert( pX->o
13280 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75  p==TK_IN );.  mu
13290 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e  stBeUnique = (in
132a0 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
132b0 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a  _LOOP)!=0;..  /*
132c0 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
132d0 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72  his IN(...) oper
132e0 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54  ator is a SELECT
132f0 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74  , and if it matt
13300 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ers .  ** whethe
13310 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c  r or not the SEL
13320 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61  ECT result conta
13330 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ins NULL values,
13340 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20   check whether. 
13350 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20   ** or not NULL 
13360 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73  is actually poss
13370 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74  ible (it may not
13380 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   be, for example
13390 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e  , due .  ** to N
133a0 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
133b0 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  nts in the schem
133c0 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76  a). If no NULL v
133d0 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62  alues are possib
133e0 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52  le,.  ** set prR
133f0 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62  hsHasNull to 0 b
13400 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
13410 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68  .  */.  if( prRh
13420 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d  sHasNull && (pX-
13430 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
13440 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e  elect) ){.    in
13450 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  t i;.    ExprLis
13460 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e  t *pEList = pX->
13470 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
13480 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
13490 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
134a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
134b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
134c0 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b  eNull(pEList->a[
134d0 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61  i].pExpr) ) brea
134e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
134f0 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70   i==pEList->nExp
13500 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73  r ){.      prRhs
13510 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  HasNull = 0;.   
13520 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
13530 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
13540 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
13550 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
13560 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
13570 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
13580 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
13590 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
135a0 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
135b0 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a  emeral table.  *
135c0 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
135d0 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20  nErr==0 && (p = 
135e0 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
135f0 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20  Opt(pX))!=0 ){. 
13600 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
13610 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
13620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
13630 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13640 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
13650 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
13660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13670 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
13680 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b   */.    i16 iDb;
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
136b0 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66  * Database idx f
136c0 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45  or pTab */.    E
136d0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
136e0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
136f0 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c   int nExpr = pEL
13700 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20  ist->nExpr;..   
13710 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
13720 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  st!=0 );        
13730 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
13740 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
13750 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
13760 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
13770 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  st->a[0].pExpr!=
13780 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  0 ); /* Because 
13790 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
137a0 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
137b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
137c0 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
137d0 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
137e0 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
137f0 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
13800 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
13810 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20  >a[0].pTab;..   
13820 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54   /* Code an OP_T
13830 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f  ransaction and O
13840 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
13850 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
13860 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
13870 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
13880 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
13890 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
138a0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
138b0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
138c0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
138d0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
138e0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
138f0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73  zName);..    ass
13900 65 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69  ert(v);  /* sqli
13910 74 65 33 47 65 74 56 64 62 65 28 29 20 68 61 73  te3GetVdbe() has
13920 20 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65   always been pre
13930 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a  viously called *
13940 2f 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d  /.    if( nExpr=
13950 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
13960 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  0].pExpr->iColum
13970 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  n<0 ){.      /* 
13980 54 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43  The "x IN (SELEC
13990 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62  T rowid FROM tab
139a0 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20  le)" case */.   
139b0 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
139c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
139d0 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20  (v, OP_Once);.  
139e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
139f0 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  (v);..      sqli
13a00 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
13a10 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
13a20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
13a30 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
13a40 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
13a50 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
13a60 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
13a70 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73  iAddr);.    }els
13a80 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
13a90 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13ab0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
13ac0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  le */.      int 
13ad0 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b  affinity_ok = 1;
13ae0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  .      int i;.. 
13af0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
13b00 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
13b10 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
13b20 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63  d to perform eac
13b30 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  h .      ** comp
13b40 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61  arison is the sa
13b50 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69  me as the affini
13b60 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  ty of each colum
13b70 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20  n in table.     
13b80 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f   ** on the RHS o
13b90 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
13ba0 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69  r.  If it not, i
13bb0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
13bc0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73  e to.      ** us
13bd0 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74  e any index of t
13be0 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a  he RHS table.  *
13bf0 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
13c00 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69   i<nExpr && affi
13c10 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20  nity_ok; i++){. 
13c20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68         Expr *pLh
13c30 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  s = sqlite3Vecto
13c40 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58  rFieldSubexpr(pX
13c50 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  ->pLeft, i);.   
13c60 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
13c70 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
13c80 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
13c90 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66       char idxaff
13ca0 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43   = sqlite3TableC
13cb0 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54  olumnAffinity(pT
13cc0 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53  ab,iCol); /* RHS
13cd0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
13ce0 20 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20    char cmpaff = 
13cf0 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
13d00 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78  finity(pLhs, idx
13d10 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65  aff);.        te
13d20 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d  stcase( cmpaff==
13d30 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
13d40 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
13d50 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c  ase( cmpaff==SQL
13d60 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a  ITE_AFF_TEXT );.
13d70 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
13d80 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20  cmpaff ){.      
13d90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
13da0 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20  AFF_BLOB:.      
13db0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13dc0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
13dd0 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20  TE_AFF_TEXT:.   
13de0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
13df0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
13e00 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e  ty() only return
13e10 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69  s TEXT if one si
13e20 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20  de or the.      
13e30 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68        ** other h
13e40 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61  as no affinity a
13e50 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  nd the other sid
13e60 65 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63  e is TEXT.  Henc
13e70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e,.            *
13e80 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66  * the only way f
13e90 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20  or cmpaff to be 
13ea0 54 45 58 54 20 69 73 20 66 6f 72 20 69 64 78 61  TEXT is for idxa
13eb0 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20  ff to be TEXT.  
13ec0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
13ed0 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e   for the term on
13ee0 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
13ef0 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66  IN to have no af
13f00 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20  finity. */.     
13f10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
13f20 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  dxaff==SQLITE_AF
13f30 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20  F_TEXT );.      
13f40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13f50 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
13f60 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66 69              affi
13f70 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65  nity_ok = sqlite
13f80 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
13f90 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20  ty(idxaff);.    
13fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
13fb0 20 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74       if( affinit
13fc0 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  y_ok ){.        
13fd0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
13fe0 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20   existing index 
13ff0 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66  that will work f
14000 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61  or this IN opera
14010 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  tor */.        f
14020 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
14030 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54  ndex; pIdx && eT
14040 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64  ype==0; pIdx=pId
14050 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
14060 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c       Bitmask col
14070 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f  Used;      /* Co
14080 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
14090 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  ex used */.     
140a0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f       Bitmask mCo
140b0 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  l;         /* Ma
140c0 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  sk for the curre
140d0 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20  nt column */.   
140e0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
140f0 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29  >nColumn<nExpr )
14100 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
14110 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
14120 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32  nColumn is BMS-2
14130 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20  , not BMS-1, so 
14140 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70  that we can comp
14150 75 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ute.          **
14160 20 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20   BITMASK(nExpr) 
14170 77 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77  without overflow
14180 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ing */.         
14190 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d   testcase( pIdx-
141a0 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20  >nColumn==BMS-2 
141b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
141c0 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f  tcase( pIdx->nCo
141d0 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  lumn==BMS-1 );. 
141e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
141f0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d  x->nColumn>=BMS-
14200 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  1 ) continue;.  
14210 20 20 20 20 20 20 20 20 69 66 28 20 6d 75 73 74          if( must
14220 42 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20  BeUnique ){.    
14230 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14240 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a  ->nKeyCol>nExpr.
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28               ||(
14260 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45  pIdx->nColumn>nE
14270 78 70 72 20 26 26 20 21 49 73 55 6e 69 71 75 65  xpr && !IsUnique
14280 49 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20 20  Index(pIdx)).   
14290 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
142a0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
142b0 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64  ue;  /* This ind
142c0 65 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  ex is not unique
142d0 20 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48 53   over the IN RHS
142e0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
142f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14300 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
14310 20 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20     colUsed = 0; 
14320 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20    /* Columns of 
14330 69 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66 61  index used so fa
14340 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  r */.          f
14350 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
14360 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
14370 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20     Expr *pLhs = 
14380 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
14390 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c  ldSubexpr(pX->pL
143a0 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  eft, i);.       
143b0 20 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20       Expr *pRhs 
143c0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
143d0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
143e0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20    CollSeq *pReq 
143f0 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
14400 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
14410 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73  arse, pLhs, pRhs
14420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
14430 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20  nt j;.  .       
14440 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
14450 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43  q!=0 || pRhs->iC
14460 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20  olumn==XN_ROWID 
14470 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
14480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
14490 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b  or(j=0; j<nExpr;
144a0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
144b0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
144c0 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73  iColumn[j]!=pRhs
144d0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->iColumn ) cont
144e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
144f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
14500 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20  ->azColl[j] );. 
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
14520 20 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69   pReq!=0 && sqli
14530 74 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d  te3StrICmp(pReq-
14540 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
14550 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20  Coll[j])!=0 ){. 
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
14570 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14590 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
145a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
145b0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
145c0 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  Expr ) break;.  
145d0 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d            mCol =
145e0 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20   MASKBIT(j);.   
145f0 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f           if( mCo
14600 6c 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72  l & colUsed ) br
14610 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c  eak; /* Each col
14620 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e  umn used only on
14630 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ce */.          
14640 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f    colUsed |= mCo
14650 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  l;.            i
14660 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70  f( aiMap ) aiMap
14670 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  [i] = j;.       
14680 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
14690 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78    assert( i==nEx
146a0 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28  pr || colUsed!=(
146b0 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31  MASKBIT(nExpr)-1
146c0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
146d0 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53  f( colUsed==(MAS
146e0 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29  KBIT(nExpr)-1) )
146f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
14700 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
14710 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
14720 61 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70 49  ans the index pI
14730 64 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a  dx is usable */.
14740 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
14750 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  iAddr = sqlite3V
14760 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
14770 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
14780 61 67 65 28 76 29 3b 0a 23 69 66 6e 64 65 66 20  age(v);.#ifndef 
14790 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
147a0 41 49 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  AIN.            
147b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
147c0 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
147d0 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20   0, 0, 0,.      
147e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
147f0 50 72 69 6e 74 66 28 64 62 2c 20 22 55 53 49 4e  Printf(db, "USIN
14800 47 20 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49  G INDEX %s FOR I
14810 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78  N-OPERATOR",pIdx
14820 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  ->zName),.      
14830 20 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d          P4_DYNAM
14840 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  IC);.#endif.    
14850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14860 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14870 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20  OpenRead, iTab, 
14880 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
14890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
148a0 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
148b0 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
148c0 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  dx);.           
148d0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
148e0 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
148f0 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
14900 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44    assert( IN_IND
14910 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d  EX_INDEX_DESC ==
14920 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
14930 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ASC+1 );.       
14940 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
14950 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
14960 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  + pIdx->aSortOrd
14970 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20  er[0];.  .      
14980 20 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48        if( prRhsH
14990 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66  asNull ){.#ifdef
149a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
149b0 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a  OLUMN_USED_MASK.
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 36                i6
149d0 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78  4 mask = (1<<nEx
149e0 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  pr)-1;.         
149f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14a00 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
14a10 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20  _ColumnsUsed, . 
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38   iTab, 0, 0, (u8
14a40 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36  *)&mask, P4_INT6
14a50 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  4);.#endif.     
14a60 20 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48           *prRhsH
14a70 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  asNull = ++pPars
14a80 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
14a90 20 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72         if( nExpr
14aa0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
14ab0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
14ac0 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
14ad0 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e  iTab, *prRhsHasN
14ae0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
14af0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14b00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
14b10 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
14b20 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20  ere(v, iAddr);. 
14b30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14b40 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70     } /* End loop
14b50 20 6f 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f   over indexes */
14b60 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20  .      } /* End 
14b70 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  if( affinity_ok 
14b80 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e  ) */.    } /* En
14b90 64 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69  d if not an rowi
14ba0 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f  d index */.  } /
14bb0 2a 20 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f  * End attempt to
14bc0 20 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20   optimize using 
14bd0 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f  an index */..  /
14be0 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74  * If no preexist
14bf0 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61  ing index is ava
14c00 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49  ilable for the I
14c10 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e  N clause.  ** an
14c20 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  d IN_INDEX_NOOP 
14c30 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65  is an allowed re
14c40 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ply.  ** and the
14c50 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
14c60 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
14c70 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t, not a subquer
14c80 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52  y.  ** and the R
14c90 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  HS is not consta
14ca0 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72  nt or has two or
14cb0 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20   fewer terms,.  
14cc0 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  ** then it is no
14cd0 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67  t worth creating
14ce0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
14cf0 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ble to evaluate.
14d00 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72    ** the IN oper
14d10 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49  ator so return I
14d20 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20  N_INDEX_NOOP..  
14d30 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
14d40 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73  0.   && (inFlags
14d50 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   & IN_INDEX_NOOP
14d60 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72  _OK).   && !Expr
14d70 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
14d80 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20  EP_xIsSelect).  
14d90 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52   && (!sqlite3InR
14da0 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29  hsIsConstant(pX)
14db0 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d   || pX->x.pList-
14dc0 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a  >nExpr<=2).  ){.
14dd0 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
14de0 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a  NDEX_NOOP;.  }..
14df0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29    if( eType==0 )
14e00 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e  {.    /* Could n
14e10 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74  ot find an exist
14e20 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
14e30 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65  ex to use as the
14e40 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20   RHS b-tree..   
14e50 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65   ** We will have
14e60 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
14e70 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
14e80 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20  to do the job.. 
14e90 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61     */.    u32 sa
14ea0 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
14eb0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
14ec0 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79  op;.    int rMay
14ed0 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  HaveNull = 0;.  
14ee0 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
14ef0 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20  EX_EPH;.    if( 
14f00 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
14f10 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20  EX_LOOP ){.     
14f20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
14f30 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  oop = 0;.      i
14f40 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43  f( pX->pLeft->iC
14f50 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72  olumn<0 && !Expr
14f60 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
14f70 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
14f80 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d  .        eType =
14f90 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
14fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
14fb0 73 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e  se if( prRhsHasN
14fc0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72  ull ){.      *pr
14fd0 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61  RhsHasNull = rMa
14fe0 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50  yHaveNull = ++pP
14ff0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
15000 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
15010 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
15020 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e  e, pX, rMayHaveN
15030 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  ull, eType==IN_I
15040 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20  NDEX_ROWID);.   
15050 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
15060 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72  oop = savedNQuer
15070 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yLoop;.  }else{.
15080 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d      pX->iTable =
15090 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66   iTab;.  }..  if
150a0 28 20 61 69 4d 61 70 20 26 26 20 65 54 79 70 65  ( aiMap && eType
150b0 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  !=IN_INDEX_INDEX
150c0 5f 41 53 43 20 26 26 20 65 54 79 70 65 21 3d 49  _ASC && eType!=I
150d0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
150e0 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  SC ){.    int i,
150f0 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69   n;.    n = sqli
15100 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
15110 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  e(pX->pLeft);.  
15120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
15130 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20  i++) aiMap[i] = 
15140 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
15150 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  eType;.}.#endif.
15160 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15170 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
15180 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78  .** Argument pEx
15190 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e  pr is an (?, ?..
151a0 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65  .) IN(...) expre
151b0 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20  ssion. This .** 
151c0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
151d0 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  es and returns a
151e0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
151f0 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
15200 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69  g .** the affini
15210 74 69 65 73 20 74 6f 20 62 65 20 75 73 65 64 20  ties to be used 
15220 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
15230 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
15240 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74  n..**.** It is t
15250 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
15260 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
15270 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
15280 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73  he returned.** s
15290 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61  tring is eventua
152a0 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
152b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
152c0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
152d0 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28  *exprINAffinity(
152e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
152f0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45  xpr *pExpr){.  E
15300 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
15310 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74  pr->pLeft;.  int
15320 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
15330 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
15340 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a  eft);.  Select *
15350 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72  pSelect = (pExpr
15360 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
15370 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d  Select) ? pExpr-
15380 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a  >x.pSelect : 0;.
15390 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20    char *zRet;.. 
153a0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
153b0 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a  op==TK_IN );.  z
153c0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
153d0 61 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d  allocRaw(pParse-
153e0 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20  >db, nVal+1);.  
153f0 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20  if( zRet ){.    
15400 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
15410 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29  =0; i<nVal; i++)
15420 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 41  {.      Expr *pA
15430 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
15440 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65  FieldSubexpr(pLe
15450 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68  ft, i);.      ch
15460 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78  ar a = sqlite3Ex
15470 70 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a  prAffinity(pA);.
15480 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63        if( pSelec
15490 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  t ){.        zRe
154a0 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f  t[i] = sqlite3Co
154b0 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 53  mpareAffinity(pS
154c0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
154d0 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20  [i].pExpr, a);. 
154e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
154f0 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b      zRet[i] = a;
15500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15510 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20     zRet[nVal] = 
15520 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75  '\0';.  }.  retu
15530 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn zRet;.}.#endi
15540 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
15550 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
15560 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50  /*.** Load the P
15570 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73  arse object pass
15580 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
15590 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e  argument with an
155a0 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61   error .** messa
155b0 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ge of the form:.
155c0 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c  **.**   "sub-sel
155d0 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f  ect returns N co
155e0 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
155f0 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73   M".*/   .void s
15600 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
15610 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  rror(Parse *pPar
15620 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c  se, int nActual,
15630 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20   int nExpect){. 
15640 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
15650 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20  t = "sub-select 
15660 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d  returns %d colum
15670 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 25 64  ns - expected %d
15680 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  ";.  sqlite3Erro
15690 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d  rMsg(pParse, zFm
156a0 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70  t, nActual, nExp
156b0 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ect);.}.#endif..
156c0 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e  /*.** Expression
156d0 20 70 45 78 70 72 20 69 73 20 61 20 76 65 63 74   pExpr is a vect
156e0 6f 72 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  or that has been
156f0 20 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74 65   used in a conte
15700 78 74 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 69  xt where.** it i
15710 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
15720 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73   If pExpr is a s
15730 75 62 2d 73 65 6c 65 63 74 20 76 65 63 74 6f 72  ub-select vector
15740 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 0a  , this routine .
15750 2a 2a 20 6c 6f 61 64 73 20 74 68 65 20 50 61 72  ** loads the Par
15760 73 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61  se object with a
15770 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20   message of the 
15780 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73  form:.**.**   "s
15790 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
157a0 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78  s N columns - ex
157b0 70 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20  pected 1".**.** 
157c0 4f 72 2c 20 69 66 20 69 74 20 69 73 20 61 20 72  Or, if it is a r
157d0 65 67 75 6c 61 72 20 73 63 61 6c 61 72 20 76 65  egular scalar ve
157e0 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72  ctor:.**.**   "r
157f0 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
15800 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c  ".*/   .void sql
15810 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d  ite3VectorErrorM
15820 73 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sg(Parse *pParse
15830 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
15840 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15850 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
15860 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
15870 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
15880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 75 62  {.    sqlite3Sub
15890 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
158a0 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  se, pExpr->x.pSe
158b0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
158c0 78 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  xpr, 1);.  }else
158d0 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
158e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
158f0 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c  pParse, "row val
15900 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20  ue misused");.  
15910 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
15920 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61  ate code for sca
15930 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75  lar subqueries u
15940 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72  sed as a subquer
15950 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58  y expression, EX
15960 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f  ISTS,.** or IN o
15970 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70  perators.  Examp
15980 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  les:.**.**     (
15990 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
159a0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62            -- sub
159b0 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49  query.**     EXI
159c0 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52  STS (SELECT a FR
159d0 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54  OM b)   -- EXIST
159e0 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  S subquery.**   
159f0 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20    x IN (4,5,11) 
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
15a10 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
15a20 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68   list on right-h
15a30 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20  and side.**     
15a40 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46  x IN (SELECT a F
15a50 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e  ROM b)     -- IN
15a60 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73   operator with s
15a70 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72  ubquery on the r
15a80 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ight.**.** The p
15a90 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64  Expr parameter d
15aa0 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70  escribes the exp
15ab0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
15ac0 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20  tains the IN.** 
15ad0 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71  operator or subq
15ae0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  uery..**.** If p
15af0 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64  arameter isRowid
15b00 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
15b10 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  en expression pE
15b20 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  xpr is guarantee
15b30 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68  d.** to be of th
15b40 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20  e form "<rowid> 
15b50 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77  IN (?, ?, ?)", w
15b60 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20  here <rowid> is 
15b70 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74  a reference.** t
15b80 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b  o some integer k
15b90 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  ey column of a t
15ba0 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20  able B-Tree. In 
15bb0 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61  this case, use a
15bc0 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72  n.** intkey B-Tr
15bd0 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ee to store the 
15be0 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76  set of IN(...) v
15bf0 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66  alues instead of
15c00 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73   the usual.** (s
15c10 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20  lower) variable 
15c20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72  length keys B-Tr
15c30 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
15c40 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e  yHaveNull is non
15c50 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e  -zero, that mean
15c60 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61  s that the opera
15c70 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a  tion is an IN.**
15c80 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f   (not a SELECT o
15c90 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68  r EXISTS) and th
15ca0 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74  at the RHS might
15cb0 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e   contains NULLs.
15cc0 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  .** All this rou
15cd0 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69  tine does is ini
15ce0 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69  tialize the regi
15cf0 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d  ster given by rM
15d00 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f  ayHaveNull.** to
15d10 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20   NULL.  Calling 
15d20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61  routines will ta
15d30 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67  ke care of chang
15d40 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65  ing this registe
15d50 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f  r.** value to no
15d60 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  n-NULL if the RH
15d70 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a  S is NULL-free..
15d80 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45  **.** For a SELE
15d90 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  CT or EXISTS ope
15da0 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68  rator, return th
15db0 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  e register that 
15dc0 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73  holds the.** res
15dd0 75 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74  ult.  For a mult
15de0 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c  i-column SELECT,
15df0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
15e00 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69  tored in a conti
15e10 67 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f  guous.** array o
15e20 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  f registers and 
15e30 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
15e40 20 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72   is the register
15e50 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   of the left-mos
15e60 74 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75  t.** result colu
15e70 6d 6e 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f  mn.  Return 0 fo
15e80 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f  r IN operators o
15e90 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
15ea0 63 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  curs..*/.#ifndef
15eb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
15ec0 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
15ed0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a  3CodeSubselect(.
15ee0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
15f00 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
15f10 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
15f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15f30 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20   IN, SELECT, or 
15f40 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20  EXISTS operator 
15f50 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c  */.  int rHasNul
15f60 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20  lFlag,       /* 
15f70 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65  Register that re
15f80 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55  cords whether NU
15f90 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53  LLs exist in RHS
15fa0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69   */.  int isRowi
15fb0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d             /*
15fc0 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66   If true, LHS of
15fd0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
15fe0 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
15ff0 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  int jmpIfDynamic
16000 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
16010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16020 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
16030 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
16040 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16060 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
16070 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
16080 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
16090 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
160a0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
160b0 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
160c0 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
160d0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
160e0 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65  se);..  /* The e
160f0 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  valuation of the
16100 20 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43   IN/EXISTS/SELEC
16110 54 20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74  T must be repeat
16120 65 64 20 65 76 65 72 79 20 74 69 6d 65 20 69 74  ed every time it
16130 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74  .  ** is encount
16140 65 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74  ered if any of t
16150 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
16160 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
16170 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
16180 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63  hand side is a c
16190 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
161a0 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  ry.  **    *  Th
161b0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
161c0 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69  e is an expressi
161d0 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  on list containi
161e0 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  ng variables.  *
161f0 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69  *    *  We are i
16200 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a  nside a trigger.
16210 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c    **.  ** If all
16220 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
16230 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65  e false, then we
16240 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f   can run this co
16250 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a  de just once.  *
16260 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c  * save the resul
16270 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68  ts, and reuse th
16280 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e  e same result on
16290 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f   subsequent invo
162a0 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  cations..  */.  
162b0 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
162c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
162d0 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  arSelect) ){.   
162e0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
162f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16300 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
16310 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16320 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
16330 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
16340 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
16350 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
16360 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
16370 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
16380 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54  rse->db, "EXECUT
16390 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59 20  E %s%s SUBQUERY 
163a0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70  %d",.        jmp
163b0 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a  IfDynamic>=0?"":
163c0 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20  "CORRELATED ",. 
163d0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
163e0 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22  ==TK_IN?"LIST":"
163f0 53 43 41 4c 41 52 22 2c 0a 20 20 20 20 20 20 20  SCALAR",.       
16400 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
16410 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20  lectId.    );.  
16420 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16430 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
16440 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
16450 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
16460 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
16470 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69   }.#endif..  swi
16480 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
16490 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
164a0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
164b0 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
164c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
164d0 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   of OP_OpenEphem
164e0 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
164f0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
16500 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
16510 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53  Left; /* the LHS
16520 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
16530 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79  tor */.      Key
16540 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
16550 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20   0;      /* Key 
16560 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
16570 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20       int nVal;  
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16590 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74   /* Size of vect
165a0 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20 20  or pLeft */.    
165b0 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d 20    .      nVal = 
165c0 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
165d0 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
165e0 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
165f0 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20  owid || nVal==1 
16600 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
16610 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
16620 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
16630 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
16640 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
16650 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
16660 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
16670 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65   same way.  An e
16680 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
16690 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c  s .      ** fill
166a0 65 64 20 77 69 74 68 20 69 6e 64 65 78 20 6b 65  ed with index ke
166b0 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
166c0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
166d0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 53   the .      ** S
166e0 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
166f0 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
16700 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
16710 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
16720 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
16730 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
16740 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
16750 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
16760 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
16770 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
16780 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
16790 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
167a0 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
167b0 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
167c0 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
167d0 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
167e0 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
167f0 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
16800 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
16810 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
16820 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
16830 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
16840 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
16850 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
16860 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
16870 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
16880 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
16890 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
168a0 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
168b0 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
168c0 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
168d0 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
168e0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
168f0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
16900 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
16910 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20  penEphemeral, . 
16920 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
16930 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69 64  iTable, (isRowid
16940 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20  ?0:nVal));.     
16950 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f   pKeyInfo = isRo
16960 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  wid ? 0 : sqlite
16970 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
16980 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20  arse->db, nVal, 
16990 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45  1);..      if( E
169a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
169b0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
169c0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ct) ){.        /
169d0 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
169e0 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
169f0 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
16a00 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
16a10 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
16a20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
16a30 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
16a40 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
16a50 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
16a60 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
16a70 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
16a80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c    */.        Sel
16a90 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70  ect *pSelect = p
16aa0 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
16ab0 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
16ac0 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  t *pEList = pSel
16ad0 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  ect->pEList;..  
16ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69        assert( !i
16af0 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  sRowid );.      
16b00 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20    /* If the LHS 
16b10 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20 49  and RHS of the I
16b20 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f  N operator do no
16b30 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20 20  t match, that.  
16b40 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77        ** error w
16b50 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61  ill have been ca
16b60 75 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65  ught long before
16b70 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
16b80 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  oint. */.       
16b90 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c 69   if( ALWAYS(pELi
16ba0 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29  st->nExpr==nVal)
16bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
16bc0 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
16bd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
16be0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16bf0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
16c00 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20  &dest, SRT_Set, 
16c10 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
16c20 20 20 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a            dest.z
16c30 41 66 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e  AffSdst = exprIN
16c40 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
16c50 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
16c60 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d     pSelect->iLim
16c70 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
16c80 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65 6c    testcase( pSel
16c90 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
16ca0 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
16cb0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
16cc0 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29  e( pKeyInfo==0 )
16cd0 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f  ; /* Caused by O
16ce0 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79  OM in sqlite3Key
16cf0 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20  InfoAlloc() */. 
16d00 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
16d10 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
16d20 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73  e, pSelect, &des
16d30 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
16d40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16d50 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74  pParse->db, dest
16d60 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20  .zAffSdst);.    
16d70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
16d80 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
16d90 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
16da0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
16db0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16dc0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16dd0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73  (pParse->db, des
16de0 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20  t.zAffSdst);.   
16df0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16e00 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a  KeyInfo!=0 ); /*
16e10 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20   OOM will cause 
16e20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c 69 74  exit after sqlit
16e30 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20  e3Select() */.  
16e40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16e50 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
16e60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16e70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
16e80 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
16e90 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
16ea0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
16eb0 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20  eyInfo) );.     
16ec0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
16ed0 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVal; i++){.    
16ee0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
16ef0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
16f00 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66  ieldSubexpr(pLef
16f10 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
16f20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
16f30 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42  ll[i] = sqlite3B
16f40 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
16f50 53 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20  Seq(.           
16f60 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20       pParse, p, 
16f70 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
16f80 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  pr.            )
16f90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
16fb0 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
16fc0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  Expr->x.pList!=0
16fd0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16fe0 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
16ff0 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
17000 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
17010 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
17020 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
17030 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
17040 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
17050 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
17060 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
17070 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
17080 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20   If <expr> is a 
17090 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65  column, then use
170a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
170b0 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
170c0 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
170d0 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
170e0 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
170f0 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e       ** a column
17100 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
17110 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20  finity..        
17120 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
17130 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
17140 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
17150 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   of the LHS of t
17160 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  he IN */.       
17170 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
17180 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
17190 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
171a0 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
171b0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
171c0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  pItem;.        i
171d0 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a  nt r1, r2, r3;..
171e0 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
171f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
17200 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20  finity(pLeft);. 
17210 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
17220 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
17230 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
17240 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
17250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17260 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
17270 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17280 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
17290 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
172a0 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
172b0 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
172c0 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[0] = sqlite3E
172d0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
172e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
172f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
17300 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
17310 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
17320 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
17330 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  t>. */.        r
17340 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
17350 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
17360 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
17370 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
17380 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
17390 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c  f( isRowid ) sql
173a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
173b0 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 32  , OP_Blob, 0, r2
173c0 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53 54 41 54  , 0, "", P4_STAT
173d0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  IC);.        for
173e0 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  (i=pList->nExpr,
173f0 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
17400 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
17410 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
17420 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d  xpr *pE2 = pItem
17430 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
17440 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73     int iValToIns
17450 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
17460 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
17470 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  n is not constan
17480 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  t then we will n
17490 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
174a0 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20   ** disable the 
174b0 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65  test that was ge
174c0 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68  nerated above th
174d0 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20  at makes sure.  
174e0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
174f0 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
17500 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
17510 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
17520 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  tant.          *
17530 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * expression we 
17540 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68  need to rerun th
17550 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d  is code each tim
17560 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
17570 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d            if( jm
17580 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26  pIfDynamic>=0 &&
17590 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
175a0 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
175b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
175c0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
175d0 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  oop(v, jmpIfDyna
175e0 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mic);.          
175f0 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d    jmpIfDynamic =
17600 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
17610 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
17620 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
17630 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
17640 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
17650 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
17660 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
17670 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  d && sqlite3Expr
17680 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26  IsInteger(pE2, &
17690 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20  iValToIns) ){.  
176a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
176b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
176c0 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78  P_InsertInt, pEx
176d0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
176e0 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20  iValToIns);.    
176f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17700 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71           r3 = sq
17710 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
17720 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c  get(pParse, pE2,
17730 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
17740 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b    if( isRowid ){
17750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
17760 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17770 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
17780 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
17790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
177b0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
177c0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
177d0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
177e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
177f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17800 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
17810 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
17820 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  r2, r3);.       
17830 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17840 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17850 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
17860 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
17870 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
17880 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
17890 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
178a0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
178b0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c  ange(pParse, r3,
178c0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
178d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
178e0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
178f0 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  xInsert, pExpr->
17900 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 2c 20  iTable, r2, r3, 
17910 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
17920 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
17930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17940 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17950 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
17960 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17970 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
17980 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
17990 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
179a0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
179b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
179c0 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
179d0 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66   (void *)pKeyInf
179e0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
179f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
17a00 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
17a10 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
17a20 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
17a30 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  CT:.    default:
17a40 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65   {.      /* Case
17a50 20 33 3a 20 20 20 20 28 53 45 4c 45 43 54 20 2e   3:    (SELECT .
17a60 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20  .. FROM ...).   
17a70 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20     **     or:   
17a80 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 2e   EXISTS(SELECT .
17a90 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20  .. FROM ...).   
17aa0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
17ab0 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e  or a SELECT, gen
17ac0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
17ad0 74 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72  t the values for
17ae0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   all columns of.
17af0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72        ** the fir
17b00 73 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61  st row into an a
17b10 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
17b20 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  s and return the
17b30 20 69 6e 64 65 78 20 6f 66 0a 20 20 20 20 20 20   index of.      
17b40 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67  ** the first reg
17b50 69 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  ister..      **.
17b60 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
17b70 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77   is an EXISTS, w
17b80 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20  rite an integer 
17b90 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f  0 (not exists) o
17ba0 72 20 31 20 28 65 78 69 73 74 73 29 0a 20 20 20  r 1 (exists).   
17bb0 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67     ** into a reg
17bc0 69 73 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e  ister and return
17bd0 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e   that register n
17be0 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  umber..      **.
17bf0 20 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68        ** In both
17c00 20 63 61 73 65 73 2c 20 74 68 65 20 71 75 65 72   cases, the quer
17c10 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20 77  y is augmented w
17c20 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20 20  ith "LIMIT 1".  
17c30 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20 70 72  Any .      ** pr
17c40 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20  eexisting limit 
17c50 69 73 20 64 69 73 63 61 72 64 65 64 20 69 6e 20  is discarded in 
17c60 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77  place of the new
17c70 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20 20 20   LIMIT 1..      
17c80 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
17c90 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20  *pSel;          
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17cb0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
17cc0 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a  nt to encode */.
17cd0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
17ce0 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20   dest;          
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
17d00 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ow to deal with 
17d10 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f  SELECT result */
17d20 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65 67 3b  .      int nReg;
17d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17d50 52 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  Registers to all
17d60 6f 63 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 45  ocate */.      E
17d70 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c 69 6d 69       /* New limi
17da0 74 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  t expression */.
17db0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17dc0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
17dd0 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
17de0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
17df0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
17e00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17e10 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
17e20 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  STS || pExpr->op
17e30 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
17e40 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
17e50 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17e60 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
17e70 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c  ) );..      pSel
17e80 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
17e90 65 63 74 3b 0a 20 20 20 20 20 20 6e 52 65 67 20  ect;.      nReg 
17ea0 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  = pExpr->op==TK_
17eb0 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70  SELECT ? pSel->p
17ec0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31  EList->nExpr : 1
17ed0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
17ee0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
17ef0 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  est, 0, pParse->
17f00 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70  nMem+1);.      p
17f10 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
17f20 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Reg;.      if( p
17f30 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
17f40 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ECT ){.        d
17f50 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
17f60 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73  Mem;.        des
17f70 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69  t.iSdst = dest.i
17f80 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20  SDParm;.        
17f90 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65  dest.nSdst = nRe
17fa0 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  g;.        sqlit
17fb0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17fc0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74  OP_Null, 0, dest
17fd0 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69  .iSDParm, dest.i
17fe0 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a  SDParm+nReg-1);.
17ff0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
18000 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75  ent((v, "Init su
18010 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
18020 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18030 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
18040 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a  t = SRT_Exists;.
18050 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18060 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18070 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74  Integer, 0, dest
18080 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  .iSDParm);.     
18090 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
180a0 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20  v, "Init EXISTS 
180b0 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
180c0 20 7d 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20   }.      pLimit 
180d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
180e0 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54  oc(pParse->db, T
180f0 4b 5f 49 4e 54 45 47 45 52 2c 26 73 71 6c 69 74  K_INTEGER,&sqlit
18100 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20  e3IntTokens[1], 
18110 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
18120 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  el->pLimit ){.  
18130 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18140 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
18150 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
18160 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
18170 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e    pSel->pLimit->
18180 70 4c 65 66 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  pLeft = pLimit;.
18190 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
181a0 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
181b0 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
181c0 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49  (pParse, TK_LIMI
181d0 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20  T, pLimit, 0);. 
181e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65       }.      pSe
181f0 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  l->iLimit = 0;. 
18200 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
18210 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
18220 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  Sel, &dest) ){. 
18230 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
18240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
18250 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Reg = dest.iSDPa
18260 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65  rm;.      ExprSe
18270 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
18280 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
18290 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
182a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
182b0 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a  rHasNullFlag ){.
182c0 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
182d0 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78  sNullFlag(v, pEx
182e0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73  pr->iTable, rHas
182f0 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a  NullFlag);.  }..
18300 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d    if( jmpIfDynam
18310 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ic>=0 ){.    sql
18320 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
18330 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  (v, jmpIfDynamic
18340 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
18350 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
18360 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  rse);..  return 
18370 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rReg;.}.#endif /
18380 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
18390 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
183a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
183b0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78  UBQUERY./*.** Ex
183c0 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49 4e 28  pr pIn is an IN(
183d0 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e  ...) expression.
183e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
183f0 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 0a  hecks that the .
18400 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 6e  ** sub-select on
18410 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
18420 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20 68 61  IN() operator ha
18430 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  s the same numbe
18440 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  r of .** columns
18450 20 61 73 20 74 68 65 20 76 65 63 74 6f 72 20 6f   as the vector o
18460 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20 69  n the LHS. Or, i
18470 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
18480 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a 2a   IN() is not .**
18490 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20 74 68   a sub-query, th
184a0 61 74 20 74 68 65 20 4c 48 53 20 69 73 20 61 20  at the LHS is a 
184b0 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20 31  vector of size 1
184c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
184d0 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61 72 73  ExprCheckIN(Pars
184e0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
184f0 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56 65  *pIn){.  int nVe
18500 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78  ctor = sqlite3Ex
18510 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 49 6e  prVectorSize(pIn
18520 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
18530 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45 50  (pIn->flags & EP
18540 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
18550 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d     if( nVector!=
18560 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  pIn->x.pSelect->
18570 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
18580 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75  .      sqlite3Su
18590 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
185a0 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c  rse, pIn->x.pSel
185b0 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
185c0 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  pr, nVector);.  
185d0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
185e0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
185f0 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20  nVector!=1 ){.  
18600 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45    sqlite3VectorE
18610 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18620 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  pIn->pLeft);.   
18630 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
18640 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
18650 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
18660 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
18670 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
18680 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20   code for an IN 
18690 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
186a0 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  *      x IN (SEL
186b0 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20  ECT ...).**     
186c0 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61   x IN (value, va
186d0 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  lue, ...).**.** 
186e0 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  The left-hand si
186f0 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63  de (LHS) is a sc
18700 61 6c 61 72 20 6f 72 20 76 65 63 74 6f 72 20 65  alar or vector e
18710 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20  xpression.  The 
18720 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73  .** right-hand s
18730 69 64 65 20 28 52 48 53 29 20 69 73 20 61 6e 20  ide (RHS) is an 
18740 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72  array of zero or
18750 20 6d 6f 72 65 20 73 63 61 6c 61 72 20 76 61 6c   more scalar val
18760 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62  ues, or a.** sub
18770 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 52  query.  If the R
18780 48 53 20 69 73 20 61 20 73 75 62 71 75 65 72 79  HS is a subquery
18790 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
187a0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
187b0 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65  ust.** match the
187c0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
187d0 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72  ns in the vector
187e0 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20 49 66   on the LHS.  If
187f0 20 74 68 65 20 52 48 53 20 69 73 0a 2a 2a 20 61   the RHS is.** a
18800 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2c   list of values,
18810 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62 65   the LHS must be
18820 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a   a scalar. .**.*
18830 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  * The IN operato
18840 72 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  r is true if the
18850 20 4c 48 53 20 76 61 6c 75 65 20 69 73 20 63 6f   LHS value is co
18860 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
18870 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72  he RHS..** The r
18880 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20 69  esult is false i
18890 66 20 74 68 65 20 4c 48 53 20 69 73 20 64 65 66  f the LHS is def
188a0 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74  initely not in t
188b0 68 65 20 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a  he RHS.  The .**
188c0 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20   result is NULL 
188d0 69 66 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  if the presence 
188e0 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 74 68  of the LHS in th
188f0 65 20 52 48 53 20 63 61 6e 6e 6f 74 20 62 65 20  e RHS cannot be 
18900 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 64  .** determined d
18910 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a  ue to NULLs..**.
18920 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18930 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
18940 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73  hat jumps to des
18950 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20  tIfFalse if the 
18960 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63  LHS is not .** c
18970 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
18980 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65  the RHS.  If due
18990 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e   to NULLs we can
189a0 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66  not determine if
189b0 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63   the LHS.** is c
189c0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
189d0 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  RHS then jump to
189e0 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66   destIfNull.  If
189f0 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74   the LHS is cont
18a00 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ained.** within 
18a10 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c  the RHS then fal
18a20 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a  l through..**.**
18a30 20 53 65 65 20 74 68 65 20 73 65 70 61 72 61 74   See the separat
18a40 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64  e in-operator.md
18a50 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
18a60 69 6c 65 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e  ile in the canon
18a70 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73  ical.** SQLite s
18a80 6f 75 72 63 65 20 74 72 65 65 20 66 6f 72 20 61  ource tree for a
18a90 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
18aa0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
18ab0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70   void sqlite3Exp
18ac0 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65  rCodeIN(.  Parse
18ad0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
18ae0 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
18af0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
18b00 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
18b10 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
18b20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70     /* The IN exp
18b30 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
18b40 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20   destIfFalse,   
18b50 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
18b60 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  if LHS is not co
18b70 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
18b80 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  HS */.  int dest
18b90 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a  IfNull        /*
18ba0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
18bb0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e  e results are un
18bc0 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c  known due to NUL
18bd0 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  Ls */.){.  int r
18be0 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20  RhsHasNull = 0; 
18bf0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61   /* Register tha
18c00 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53  t is true if RHS
18c10 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76   contains NULL v
18c20 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65  alues */.  int e
18c30 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
18c40 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20   /* Type of the 
18c50 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68  RHS */.  int rLh
18c60 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
18c70 2a 20 52 65 67 69 73 74 65 72 28 73 29 20 68 6f  * Register(s) ho
18c80 6c 64 69 6e 67 20 74 68 65 20 4c 48 53 20 76 61  lding the LHS va
18c90 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c  lues */.  int rL
18ca0 68 73 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20  hsOrig;         
18cb0 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73 20 70 72  /* LHS values pr
18cc0 69 6f 72 20 74 6f 20 72 65 6f 72 64 65 72 69 6e  ior to reorderin
18cd0 67 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a  g by aiMap[] */.
18ce0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
18cf0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
18d00 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
18d10 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
18d20 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20 20   *aiMap = 0;    
18d30 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76     /* Map from v
18d40 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20 69  ector field to i
18d50 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  ndex column */. 
18d60 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b   char *zAff = 0;
18d70 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
18d80 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63 6f  ty string for co
18d90 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69  mparisons */.  i
18da0 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20 20  nt nVector;     
18db0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
18dc0 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69 73  vectors for this
18dd0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
18de0 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20    int iDummy;   
18df0 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79          /* Dummy
18e00 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 65 78   parameter to ex
18e10 70 72 43 6f 64 65 56 65 63 74 6f 72 28 29 20 2a  prCodeVector() *
18e20 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b  /.  Expr *pLeft;
18e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18e40 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
18e50 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
18e60 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
18e70 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74     /* loop count
18e80 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  er */.  int dest
18e90 53 74 65 70 32 3b 20 20 20 20 20 20 20 20 2f 2a  Step2;        /*
18ea0 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 77   Where to jump w
18eb0 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69  hen NULLs seen i
18ec0 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e  n step 2 */.  in
18ed0 74 20 64 65 73 74 53 74 65 70 36 20 3d 20 30 3b  t destStep6 = 0;
18ee0 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
18ef0 63 6f 64 65 20 66 6f 72 20 53 74 65 70 20 36 20  code for Step 6 
18f00 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 72 75  */.  int addrTru
18f10 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41 64  thOp;      /* Ad
18f20 64 72 65 73 73 20 6f 66 20 6f 70 63 6f 64 65 20  dress of opcode 
18f30 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
18f40 74 68 65 20 49 4e 20 69 73 20 74 72 75 65 20 2a  the IN is true *
18f50 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e  /.  int destNotN
18f60 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ull;      /* Jum
18f70 70 20 68 65 72 65 20 69 66 20 61 20 63 6f 6d 70  p here if a comp
18f80 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72  arison is not tr
18f90 75 65 20 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a  ue in step 6 */.
18fa0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
18fb0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
18fc0 66 20 74 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f  f the step-6 loo
18fd0 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20 3d  p */ ..  pLeft =
18fe0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
18ff0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
19000 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20  CheckIN(pParse, 
19010 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b  pExpr) ) return;
19020 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e  .  zAff = exprIN
19030 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
19040 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74   pExpr);.  nVect
19050 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  or = sqlite3Expr
19060 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
19070 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61  ->pLeft);.  aiMa
19080 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  p = (int*)sqlite
19090 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  3DbMallocZero(. 
190a0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c       pParse->db,
190b0 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66   nVector*(sizeof
190c0 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63  (int) + sizeof(c
190d0 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20  har)) + 1.  );. 
190e0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
190f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
19100 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  goto sqlite3Expr
19110 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72  CodeIN_oom_error
19120 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  ;..  /* Attempt 
19130 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52  to compute the R
19140 48 53 2e 20 41 66 74 65 72 20 74 68 69 73 20 73  HS. After this s
19150 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67  tep, if anything
19160 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a   other than.  **
19170 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
19180 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
19190 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69 74 68  table opened ith
191a0 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d 3e 69   cursor pExpr->i
191b0 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74  Table .  ** cont
191c0 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20  ains the values 
191d0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
191e0 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45   RHS. If IN_INDE
191f0 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e  X_NOOP is return
19200 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53  ed,.  ** the RHS
19210 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
19220 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76  n coded.  */.  v
19230 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
19240 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
19250 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d   );       /* OOM
19260 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20   detected prior 
19270 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
19280 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
19290 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
192a0 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54  IN expr"));.  eT
192b0 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
192c0 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
192d0 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20   pExpr,.        
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192f0 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45       IN_INDEX_ME
19300 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e  MBERSHIP | IN_IN
19310 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20  DEX_NOOP_OK,.   
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19330 20 20 20 20 20 20 20 20 20 20 64 65 73 74 49 66            destIf
19340 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
19350 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73  l ? 0 : &rRhsHas
19360 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20  Null, aiMap);.. 
19370 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
19380 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72  >nErr || nVector
19390 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e  ==1 || eType==IN
193a0 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20  _INDEX_EPH.     
193b0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49    || eType==IN_I
193c0 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c  NDEX_INDEX_ASC |
193d0 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  | eType==IN_INDE
193e0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20  X_INDEX_DESC .  
193f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
19400 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66  _DEBUG.  /* Conf
19410 69 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d  irm that aiMap[]
19420 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f   contains nVecto
19430 72 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  r integer values
19440 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20   between 0 and. 
19450 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a   ** nVector-1. *
19460 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
19470 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
19480 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20    int j, cnt;.  
19490 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a    for(cnt=j=0; j
194a0 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69  <nVector; j++) i
194b0 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29  f( aiMap[j]==i )
194c0 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65   cnt++;.    asse
194d0 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20  rt( cnt==1 );.  
194e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
194f0 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65  ode the LHS, the
19500 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65   <expr> from "<e
19510 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20  xpr> IN (...)". 
19520 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 61 20  If the LHS is a 
19530 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68  .  ** vector, th
19540 65 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64 20  en it is stored 
19550 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e  in an array of n
19560 56 65 63 74 6f 72 20 72 65 67 69 73 74 65 72 73  Vector registers
19570 20 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20   starting .  ** 
19580 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  at r1..  **.  **
19590 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
195a0 64 65 78 28 29 20 6d 69 67 68 74 20 68 61 76 65  dex() might have
195b0 20 72 65 6f 72 64 65 72 65 64 20 74 68 65 20 66   reordered the f
195c0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53  ields of the LHS
195d0 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20   vector.  ** so 
195e0 74 68 61 74 20 74 68 65 20 66 69 65 6c 64 73 20  that the fields 
195f0 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  are in the same 
19600 6f 72 64 65 72 20 61 73 20 61 6e 20 65 78 69 73  order as an exis
19610 74 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68  ting index.   Th
19620 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61  e.  ** aiMap[] a
19630 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  rray contains a 
19640 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65  mapping from the
19650 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69   original LHS fi
19660 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a  eld order to.  *
19670 2a 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65  * the field orde
19680 72 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  r that matches t
19690 68 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20  he RHS index..  
196a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
196b0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
196c0 29 3b 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20  );.  rLhsOrig = 
196d0 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70  exprCodeVector(p
196e0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69  Parse, pLeft, &i
196f0 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d  Dummy);.  for(i=
19700 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20  0; i<nVector && 
19710 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b  aiMap[i]==i; i++
19720 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66  ){} /* Are LHS f
19730 69 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f  ields reordered?
19740 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65   */.  if( i==nVe
19750 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c  ctor ){.    /* L
19760 48 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f  HS fields are no
19770 74 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20  t reordered */. 
19780 20 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72     rLhs = rLhsOr
19790 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ig;.  }else{.   
197a0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72   /* Need to reor
197b0 64 65 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c  der the LHS fiel
197c0 64 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ds according to 
197d0 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68  aiMap */.    rLh
197e0 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  s = sqlite3GetTe
197f0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
19800 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f  nVector);.    fo
19810 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
19820 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
19830 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19840 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73  v, OP_Copy, rLhs
19850 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d  Orig+i, rLhs+aiM
19860 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  ap[i], 0);.    }
19870 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71  .  }..  /* If sq
19880 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
19890 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  () did not find 
198a0 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  or create an ind
198b0 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ex that is.  ** 
198c0 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61  suitable for eva
198d0 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f  luating the IN o
198e0 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76  perator, then ev
198f0 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20  aluate using a. 
19900 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20   ** sequence of 
19910 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a  comparisons..  *
19920 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73  *.  ** This is s
19930 74 65 70 20 28 31 29 20 69 6e 20 74 68 65 20 69  tep (1) in the i
19940 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70  n-operator.md op
19950 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68  timized algorith
19960 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  m..  */.  if( eT
19970 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f  ype==IN_INDEX_NO
19980 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  OP ){.    ExprLi
19990 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
199a0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
199b0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
199c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
199d0 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
199e0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  r->pLeft);.    i
199f0 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c  nt labelOk = sql
19a00 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
19a10 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32  l(v);.    int r2
19a20 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20  , regToFree;.   
19a30 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d   int regCkNull =
19a40 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   0;.    int ii;.
19a50 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
19a60 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
19a70 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
19a80 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73  ) );.    if( des
19a90 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46  tIfNull!=destIfF
19aa0 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alse ){.      re
19ab0 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  gCkNull = sqlite
19ac0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
19ad0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
19ae0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19af0 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c  OP_BitAnd, rLhs,
19b00 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c   rLhs, regCkNull
19b10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
19b20 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d  (ii=0; ii<pList-
19b30 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
19b40 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
19b50 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
19b60 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
19b70 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f  i].pExpr, &regTo
19b80 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Free);.      if(
19b90 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71   regCkNull && sq
19ba0 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
19bb0 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  ll(pList->a[ii].
19bc0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
19bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19be0 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
19bf0 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c  , regCkNull, r2,
19c00 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
19c10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
19c20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
19c30 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d   || destIfNull!=
19c40 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
19c50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19c60 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
19c70 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b  q, rLhs, labelOk
19c80 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20  , r2,.          
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
19cb0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
19cc0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
19cd0 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  f(v, ii<pList->n
19ce0 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20  Expr-1);.       
19cf0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
19d00 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45  v, ii==pList->nE
19d10 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  xpr-1);.        
19d20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
19d30 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b  eP5(v, zAff[0]);
19d40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19d50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
19d60 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
19d70 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20  False );.       
19d80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19d90 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68  p4(v, OP_Ne, rLh
19da0 73 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  s, destIfFalse, 
19db0 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
19dd0 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
19de0 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76  OLLSEQ); VdbeCov
19df0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
19e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19e10 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d  ngeP5(v, zAff[0]
19e20 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
19e30 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
19e40 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
19e50 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
19e60 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20  e, regToFree);. 
19e70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67     }.    if( reg
19e80 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  CkNull ){.      
19e90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19ea0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
19eb0 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49  regCkNull, destI
19ec0 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65  fNull); VdbeCove
19ed0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
19ee0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
19ef0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
19f00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
19f10 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
19f20 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20  l(v, labelOk);. 
19f30 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19f40 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19f50 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
19f60 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
19f70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
19f80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  ;.  }..  /* Step
19f90 20 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   2: Check to see
19fa0 20 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74   if the LHS cont
19fb0 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f  ains any NULL co
19fc0 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20  lumns.  If the. 
19fd0 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e   ** LHS does con
19fe0 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20  tain NULLs then 
19ff0 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20  the result must 
1a000 62 65 20 65 69 74 68 65 72 20 46 41 4c 53 45 20  be either FALSE 
1a010 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65  or NULL..  ** We
1a020 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20   will then skip 
1a030 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
1a040 68 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20  h of the RHS..  
1a050 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e  */.  if( destIfN
1a060 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65  ull==destIfFalse
1a070 20 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70   ){.    destStep
1a080 32 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b  2 = destIfFalse;
1a090 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
1a0a0 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 53 74  stStep2 = destSt
1a0b0 65 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ep6 = sqlite3Vdb
1a0c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1a0d0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1a0e0 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
1a0f0 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
1a100 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
1a110 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c  ubexpr(pExpr->pL
1a120 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  eft, i);.    if(
1a130 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
1a140 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20  eNull(p) ){.    
1a150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a160 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
1a170 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 53 74  , rLhs+i, destSt
1a180 65 70 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ep2);.      Vdbe
1a190 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a1a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65   }.  }..  /* Ste
1a1b0 70 20 33 2e 20 20 54 68 65 20 4c 48 53 20 69 73  p 3.  The LHS is
1a1c0 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62 65   now known to be
1a1d0 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74   non-NULL.  Do t
1a1e0 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
1a1f0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53  .  ** of the RHS
1a200 20 75 73 69 6e 67 20 74 68 65 20 4c 48 53 20 61   using the LHS a
1a210 73 20 61 20 70 72 6f 62 65 2e 20 20 49 66 20 66  s a probe.  If f
1a220 6f 75 6e 64 2c 20 74 68 65 20 72 65 73 75 6c 74  ound, the result
1a230 20 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a 20   is.  ** true.. 
1a240 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
1a250 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
1a260 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
1a270 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20  s case, the RHS 
1a280 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  is the ROWID of 
1a290 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64  table b-tree and
1a2a0 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20 20   so we also.    
1a2b0 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ** know that the
1a2c0 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c   RHS is non-NULL
1a2d0 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 63 6f 6d  .  Hence, we com
1a2e0 62 69 6e 65 20 73 74 65 70 73 20 33 20 61 6e 64  bine steps 3 and
1a2f0 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61   4.    ** into a
1a300 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
1a310 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
1a320 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
1a330 65 65 6b 52 6f 77 69 64 2c 20 70 45 78 70 72 2d  eekRowid, pExpr-
1a340 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
1a350 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20  alse, rLhs);.   
1a360 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a370 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f  ;.    addrTruthO
1a380 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1a390 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
1a3a0 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72  );  /* Return Tr
1a3b0 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ue */.  }else{. 
1a3c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a3d0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
1a3e0 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74  ity, rLhs, nVect
1a3f0 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65  or, 0, zAff, nVe
1a400 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64  ctor);.    if( d
1a410 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1a420 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
1a430 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20  /* Combine Step 
1a440 33 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74  3 and Step 5 int
1a450 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  o a single opcod
1a460 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
1a470 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1a480 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
1a490 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
1a4a0 65 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20 20  estIfFalse,.    
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4c0 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65         rLhs, nVe
1a4d0 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72  ctor); VdbeCover
1a4e0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67 6f  age(v);.      go
1a4f0 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
1a500 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  deIN_finished;. 
1a510 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69     }.    /* Ordi
1a520 6e 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f 72  nary Step 3, for
1a530 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
1a540 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61  FALSE and NULL a
1a550 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  re distinct */. 
1a560 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d     addrTruthOp =
1a570 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a580 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
1a590 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
1a5a0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c             rLhs,
1a5d0 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43   nVector); VdbeC
1a5e0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
1a5f0 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49  .  /* Step 4.  I
1a600 66 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f  f the RHS is kno
1a610 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c  wn to be non-NUL
1a620 4c 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74  L and we did not
1a630 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61   find.  ** an ma
1a640 74 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63  tch on the searc
1a650 68 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  h above, then th
1a660 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65  e result must be
1a670 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69   FALSE..  */.  i
1a680 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26  f( rRhsHasNull &
1a690 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a  & nVector==1 ){.
1a6a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a6b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
1a6c0 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  ull, rRhsHasNull
1a6d0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
1a6e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a6f0 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  (v);.  }..  /* S
1a700 74 65 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f  tep 5.  If we do
1a710 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
1a720 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  the difference b
1a730 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a  etween NULL and.
1a740 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e    ** FALSE, then
1a750 20 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c   just return fal
1a760 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  se. .  */.  if( 
1a770 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
1a780 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65  tIfNull ) sqlite
1a790 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
1a7a0 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a  tIfFalse);..  /*
1a7b0 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68   Step 6: Loop th
1a7c0 72 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68  rough rows of th
1a7d0 65 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20  e RHS.  Compare 
1a7e0 65 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20  each row to the 
1a7f0 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79  LHS..  ** If any
1a800 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e   comparison is N
1a810 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ULL, then the re
1a820 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49  sult is NULL.  I
1a830 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61  f all.  ** compa
1a840 72 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45  risons are FALSE
1a850 20 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20   then the final 
1a860 72 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e  result is FALSE.
1a870 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61  .  **.  ** For a
1a880 20 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20   scalar LHS, it 
1a890 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
1a8a0 20 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20   check just the 
1a8b0 66 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f  first row.  ** o
1a8c0 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a  f the RHS..  */.
1a8d0 20 20 69 66 28 20 64 65 73 74 53 74 65 70 36 20    if( destStep6 
1a8e0 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  ) sqlite3VdbeRes
1a8f0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1a900 74 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54  tStep6);.  addrT
1a910 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
1a920 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
1a930 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ind, pExpr->iTab
1a940 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  le, destIfFalse)
1a950 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
1a960 28 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74  (v);.  if( nVect
1a970 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73 74  or>1 ){.    dest
1a980 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  NotNull = sqlite
1a990 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1a9a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a9b0 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d  /* For nVector==
1a9c0 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73  1, combine steps
1a9d0 20 36 20 61 6e 64 20 37 20 62 79 20 69 6d 6d 65   6 and 7 by imme
1a9e0 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 69 6e  diately returnin
1a9f0 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69  g.    ** FALSE i
1aa00 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d 70  f the first comp
1aa10 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55  arison is not NU
1aa20 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f  LL */.    destNo
1aa30 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66 46 61  tNull = destIfFa
1aa40 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  lse;.  }.  for(i
1aa50 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
1aa60 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1aa70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
1aa80 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33  Coll;.    int r3
1aa90 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1aaa0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1aab0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63    p = sqlite3Vec
1aac0 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
1aad0 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 70  pLeft, i);.    p
1aae0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1aaf0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1ab00 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
1ab10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1ab20 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d  P_Column, pExpr-
1ab30 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72 33 29 3b  >iTable, i, r3);
1ab40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ab50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
1ab60 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74   rLhs+i, destNot
1ab70 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20  Null, r3,.      
1ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab90 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
1aba0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56  _COLLSEQ);.    V
1abb0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1abc0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1abd0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1abe0 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  , r3);.  }.  sql
1abf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ac00 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1ac10 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28  stIfNull);.  if(
1ac20 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20   nVector>1 ){.  
1ac30 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1ac40 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1ac50 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  tNotNull);.    s
1ac60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ac70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 45 78  (v, OP_Next, pEx
1ac80 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72  pr->iTable, addr
1ac90 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64 62 65  Top+1);.    Vdbe
1aca0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1acb0 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49 66    /* Step 7:  If
1acc0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1acd0 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68  oint, we know th
1ace0 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  at the result mu
1acf0 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66 61 6c  st.    ** be fal
1ad00 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  se. */.    sqlit
1ad10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ad20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
1ad30 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20  IfFalse);.  }.. 
1ad40 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65 20 69   /* Jumps here i
1ad50 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74 75 72  n order to retur
1ad60 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c  n true. */.  sql
1ad70 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1ad80 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f 70 29  (v, addrTruthOp)
1ad90 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ;..sqlite3ExprCo
1ada0 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20  deIN_finished:. 
1adb0 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f   if( rLhs!=rLhsO
1adc0 72 69 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c  rig ) sqlite3Rel
1add0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1ade0 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 73 71 6c  se, rLhs);.  sql
1adf0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1ae00 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65  (pParse);.  Vdbe
1ae10 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
1ae20 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 73 71 6c   IN expr"));.sql
1ae30 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f  ite3ExprCodeIN_o
1ae40 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  om_error:.  sqli
1ae50 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1ae60 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20  ->db, aiMap);.  
1ae70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1ae80 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b  arse->db, zAff);
1ae90 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1aea0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1aeb0 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
1aec0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1aed0 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47  NG_POINT./*.** G
1aee0 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
1aef0 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
1af00 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e   put the floatin
1af10 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
1af20 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b   described by z[
1af30 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
1af40 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
1af50 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
1af60 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
1af70 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
1af80 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
1af90 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
1afa0 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
1afb0 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
1afc0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
1afd0 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
1afe0 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
1aff0 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
1b000 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52  tatic void codeR
1b010 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  eal(Vdbe *v, con
1b020 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
1b030 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20  negateFlag, int 
1b040 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57  iMem){.  if( ALW
1b050 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20  AYS(z!=0) ){.   
1b060 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20   double value;. 
1b070 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a     sqlite3AtoF(z
1b080 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65  , &value, sqlite
1b090 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51  3Strlen30(z), SQ
1b0a0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
1b0b0 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33  assert( !sqlite3
1b0c0 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20  IsNaN(value) ); 
1b0d0 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20  /* The new AtoF 
1b0e0 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61  never returns Na
1b0f0 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67  N */.    if( neg
1b100 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20  ateFlag ) value 
1b110 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71  = -value;.    sq
1b120 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
1b130 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  up8(v, OP_Real, 
1b140 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a  0, iMem, 0, (u8*
1b150 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c  )&value, P4_REAL
1b160 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
1b170 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1b180 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
1b190 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
1b1a0 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69  e integer descri
1b1b0 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b  be by.** text z[
1b1c0 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
1b1d0 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
1b1e0 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  * Expr.u.zToken 
1b1f0 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61  is always UTF8 a
1b200 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  nd zero-terminat
1b210 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1b220 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50  id codeInteger(P
1b230 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1b240 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e  pr *pExpr, int n
1b250 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  egFlag, int iMem
1b260 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1b270 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1b280 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
1b290 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
1b2a0 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45  {.    int i = pE
1b2b0 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  xpr->u.iValue;. 
1b2c0 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
1b2d0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c  );.    if( negFl
1b2e0 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
1b2f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b300 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1b310 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65  , i, iMem);.  }e
1b320 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a  lse{.    int c;.
1b330 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
1b340 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1b350 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
1b360 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
1b370 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20  z!=0 );.    c = 
1b380 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
1b390 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b  oI64(z, &value);
1b3a0 0a 20 20 20 20 69 66 28 20 28 63 3d 3d 33 20 26  .    if( (c==3 &
1b3b0 26 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28  & !negFlag) || (
1b3c0 63 3d 3d 32 29 20 7c 7c 20 28 6e 65 67 46 6c 61  c==2) || (negFla
1b3d0 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41 4c  g && value==SMAL
1b3e0 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23 69  LEST_INT64)){.#i
1b3f0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1b400 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1b410 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1b420 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
1b430 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72  versized integer
1b440 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67  : %s%s", negFlag
1b450 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b   ? "-" : "", z);
1b460 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53  .#else.#ifndef S
1b470 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49  QLITE_OMIT_HEX_I
1b480 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66 28  NTEGER.      if(
1b490 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
1b4a0 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29  p(z,"0x",2)==0 )
1b4b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b4c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b4d0 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74  , "hex literal t
1b4e0 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20 6e  oo big: %s%s", n
1b4f0 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a 29  egFlag?"-":"",z)
1b500 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
1b510 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
1b520 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
1b530 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65   z, negFlag, iMe
1b540 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  m);.      }.#end
1b550 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1b560 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
1b570 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 33 20  ){ value = c==3 
1b580 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
1b590 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20   : -value; }.   
1b5a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b5b0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49  dOp4Dup8(v, OP_I
1b5c0 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  nt64, 0, iMem, 0
1b5d0 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
1b5e0 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 0a  4_INT64);.    }.
1b5f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61    }.}../*.** Era
1b600 73 65 20 63 6f 6c 75 6d 6e 2d 63 61 63 68 65 20  se column-cache 
1b610 65 6e 74 72 79 20 6e 75 6d 62 65 72 20 69 0a 2a  entry number i.*
1b620 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  /.static void ca
1b630 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61  cheEntryClear(Pa
1b640 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1b650 20 69 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73   i){.  if( pPars
1b660 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
1b670 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69  tempReg ){.    i
1b680 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
1b690 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
1b6a0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
1b6b0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
1b6c0 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
1b6d0 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
1b6e0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1b6f0 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d  e[i].iReg;.    }
1b700 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1b710 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 69 66  ColCache--;.  if
1b720 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ( i<pParse->nCol
1b730 43 61 63 68 65 20 29 7b 0a 20 20 20 20 70 50 61  Cache ){.    pPa
1b740 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1b750 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  ] = pParse->aCol
1b760 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43  Cache[pParse->nC
1b770 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d 0a  olCache];.  }.}.
1b780 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69  ../*.** Record i
1b790 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  n the column cac
1b7a0 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69 63  he that a partic
1b7b0 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  ular column from
1b7c0 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72   a.** particular
1b7d0 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64   table is stored
1b7e0 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   in a particular
1b7f0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f   register..*/.vo
1b800 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1b810 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a  cheStore(Parse *
1b820 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
1b830 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20  , int iCol, int 
1b840 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
1b850 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20    int minLru;.  
1b860 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74  int idxLru;.  st
1b870 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1b880 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20  p;..  /* Unless 
1b890 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
1b8a0 75 72 72 65 64 2c 20 72 65 67 69 73 74 65 72 20  urred, register 
1b8b0 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61  numbers are alwa
1b8c0 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a  ys positive. */.
1b8d0 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e 30    assert( iReg>0
1b8e0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1b8f0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
1b900 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1b910 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
1b920 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38  -1 && iCol<32768
1b930 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63   );  /* Finite c
1b940 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f  olumn numbers */
1b950 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
1b960 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c  E_ColumnCache fl
1b970 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  ag disables the 
1b980 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54  column cache.  T
1b990 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  his is used.  **
1b9a0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c   for testing onl
1b9b0 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68  y - to verify th
1b9c0 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73  at SQLite always
1b9d0 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20 61   gets the same a
1b9e0 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20  nswer.  ** with 
1b9f0 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65 20  and without the 
1ba00 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
1ba10 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
1ba20 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50  ationDisabled(pP
1ba30 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
1ba40 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20  _ColumnCache) ) 
1ba50 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69  return;..  /* Fi
1ba60 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20  rst replace any 
1ba70 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a  existing entry..
1ba80 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
1ba90 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65 20  ly, the way the 
1baa0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20  column cache is 
1bab0 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20  currently used, 
1bac0 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  we are guarantee
1bad0 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  d.  ** that the 
1bae0 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65  object will neve
1baf0 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20  r already be in 
1bb00 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20 74  cache.  Verify t
1bb10 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20  his guarantee.. 
1bb20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
1bb30 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  UG.  for(i=0, p=
1bb40 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1bb50 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e; i<pParse->nCo
1bb60 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b  lCache; i++, p++
1bb70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1bb80 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
1bb90 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  | p->iColumn!=iC
1bba0 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ol );.  }.#endif
1bbb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
1bbc0 63 68 65 20 69 73 20 61 6c 72 65 61 64 79 20 66  che is already f
1bbd0 75 6c 6c 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ull, delete the 
1bbe0 6c 65 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75  least recently u
1bbf0 73 65 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  sed entry */.  i
1bc00 66 28 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  f( pParse->nColC
1bc10 61 63 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f 43  ache>=SQLITE_N_C
1bc20 4f 4c 43 41 43 48 45 20 29 7b 0a 20 20 20 20 6d  OLCACHE ){.    m
1bc30 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66  inLru = 0x7fffff
1bc40 66 66 3b 0a 20 20 20 20 69 64 78 4c 72 75 20 3d  ff;.    idxLru =
1bc50 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   -1;.    for(i=0
1bc60 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1bc70 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
1bc80 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
1bc90 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
1bca0 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29   p->lru<minLru )
1bcb0 7b 0a 20 20 20 20 20 20 20 20 69 64 78 4c 72 75  {.        idxLru
1bcc0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 6d 69   = i;.        mi
1bcd0 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20  nLru = p->lru;. 
1bce0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1bcf0 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
1bd00 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b  olCache[idxLru];
1bd10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
1bd20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  = &pParse->aColC
1bd30 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f  ache[pParse->nCo
1bd40 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a 0a  lCache++];.  }..
1bd50 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
1bd60 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 65 6e   entry to the en
1bd70 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 2a  d of the cache *
1bd80 2f 0a 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20  /.  p->iLevel = 
1bd90 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1bda0 76 65 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65  vel;.  p->iTable
1bdb0 20 3d 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69 43   = iTab;.  p->iC
1bdc0 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
1bdd0 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
1bde0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
1bdf0 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61  ;.  p->lru = pPa
1be00 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
1be10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  ;.}../*.** Indic
1be20 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65  ate that registe
1be30 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e  rs between iReg.
1be40 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65  .iReg+nReg-1 are
1be50 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
1be60 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  en..** Purge the
1be70 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
1be80 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ers from the col
1be90 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
1bea0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1beb0 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
1bec0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
1bed0 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
1bee0 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69  int i = 0;.  whi
1bef0 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  le( i<pParse->nC
1bf00 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20 73  olCache ){.    s
1bf10 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1bf20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43  *p = &pParse->aC
1bf30 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20  olCache[i];.    
1bf40 69 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20 69  if( p->iReg >= i
1bf50 52 65 67 20 26 26 20 70 2d 3e 69 52 65 67 20 3c  Reg && p->iReg <
1bf60 20 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20   iReg+nReg ){.  
1bf70 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
1bf80 65 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ear(pParse, i);.
1bf90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bfa0 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i++;.    }.  }.
1bfb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
1bfc0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
1bfd0 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65  lumn cache conte
1bfe0 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74  xt.  Any new ent
1bff0 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64  ries added.** ad
1c000 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  ded to the colum
1c010 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  n cache after th
1c020 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f  is call are remo
1c030 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ved when the.** 
1c040 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
1c050 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  p occurs..*/.voi
1c060 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1c070 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  hePush(Parse *pP
1c080 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
1c090 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a  >iCacheLevel++;.
1c0a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1c0b0 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
1c0c0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1c0d0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1c0e0 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
1c0f0 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22  f("PUSH to %d\n"
1c100 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
1c110 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
1c120 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
1c130 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  ve from the colu
1c140 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74  mn cache any ent
1c150 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61  ries that were a
1c160 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a  dded since the.*
1c170 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  * the previous s
1c180 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1c190 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ush operation.  
1c1a0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1c1b0 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63  restore.** the c
1c1c0 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74  ache to the stat
1c1d0 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f  e it was in prio
1c1e0 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
1c1f0 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20  t Push..*/.void 
1c200 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c210 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
1c220 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  e){.  int i = 0;
1c230 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1c240 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d  e->iCacheLevel>=
1c250 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  1 );.  pParse->i
1c260 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69  CacheLevel--;.#i
1c270 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1c280 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
1c290 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1c2a0 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1c2b0 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
1c2c0 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20  "POP  to %d\n", 
1c2d0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c2e0 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
1c2f0 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72  .  while( i<pPar
1c300 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b  se->nColCache ){
1c310 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1c320 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 4c  >aColCache[i].iL
1c330 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61  evel>pParse->iCa
1c340 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  cheLevel ){.    
1c350 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
1c360 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  r(pParse, i);.  
1c370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1c380 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
1c390 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61  ./*.** When a ca
1c3a0 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72  ched column is r
1c3b0 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65  eused, make sure
1c3c0 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74   that its regist
1c3d0 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67  er is.** no long
1c3e0 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20  er available as 
1c3f0 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e  a temp register.
1c400 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20    ticket #3879: 
1c410 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65   that same.** re
1c420 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20  gister might be 
1c430 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20  in the cache in 
1c440 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c  multiple places,
1c450 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a   so be sure to.*
1c460 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a  * get them all..
1c470 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1c480 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1c490 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65  inRegister(Parse
1c4a0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1c4b0 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
1c4c0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1c4d0 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
1c4e0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1c4f0 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  che; i<pParse->n
1c500 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70  ColCache; i++, p
1c510 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
1c520 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
1c530 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
1c540 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
1c550 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  ./* Generate cod
1c560 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64  e that will load
1c570 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72   into register r
1c580 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68  egOut a value th
1c590 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72  at is.** appropr
1c5a0 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64  iate for the iId
1c5b0 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  xCol-th column o
1c5c0 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f  f index pIdx..*/
1c5d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1c5e0 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f  rCodeLoadIndexCo
1c5f0 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
1c600 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70  Parse,  /* The p
1c610 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1c620 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
1c630 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1c640 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73   whose column is
1c650 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f   to be loaded */
1c660 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
1c670 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1c680 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  nting to a table
1c690 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49   row */.  int iI
1c6a0 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65  dxCol,    /* The
1c6b0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1c6c0 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65  ndex to be loade
1c6d0 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  d */.  int regOu
1c6e0 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  t      /* Store 
1c6f0 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
1c700 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
1c710 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1c720 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49  i16 iTabCol = pI
1c730 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64  dx->aiColumn[iId
1c740 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61  xCol];.  if( iTa
1c750 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b  bCol==XN_EXPR ){
1c760 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
1c770 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20  x->aColExpr );. 
1c780 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1c790 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72  >aColExpr->nExpr
1c7a0 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20  >iIdxCol );.    
1c7b0 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1c7c0 20 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b 0a   = iTabCur + 1;.
1c7d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c7e0 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20  odeCopy(pParse, 
1c7f0 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1c800 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72  a[iIdxCol].pExpr
1c810 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 70  , regOut);.    p
1c820 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1c830 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1c840 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c850 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1c860 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
1c870 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69   pIdx->pTable, i
1c880 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20  TabCur,.        
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
1c8b0 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1c8c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1c8d0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72  ate code to extr
1c8e0 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  act the value of
1c8f0 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
1c900 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  umn of a table..
1c910 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1c920 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1c930 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20  OfTable(.  Vdbe 
1c940 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *v,        /* Th
1c950 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
1c960 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  struction */.  T
1c970 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f  able *pTab,    /
1c980 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * The table cont
1c990 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
1c9a0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
1c9b0 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  r,    /* The tab
1c9c0 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74  le cursor.  Or t
1c9d0 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72  he PK cursor for
1c9e0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a   WITHOUT ROWID *
1c9f0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
1ca00 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1ca10 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78  the column to ex
1ca20 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  tract */.  int r
1ca30 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78  egOut      /* Ex
1ca40 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
1ca50 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
1ca60 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  er */.){.  if( p
1ca70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Tab==0 ){.    sq
1ca80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1ca90 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
1caa0 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67  abCur, iCol, reg
1cab0 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
1cac0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1cad0 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62  <0 || iCol==pTab
1cae0 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73  ->iPKey ){.    s
1caf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cb00 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
1cb10 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a  abCur, regOut);.
1cb20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1cb30 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28   op = IsVirtual(
1cb40 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75  pTab) ? OP_VColu
1cb50 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a  mn : OP_Column;.
1cb60 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c      int x = iCol
1cb70 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  ;.    if( !HasRo
1cb80 77 69 64 28 70 54 61 62 29 20 26 26 20 21 49 73  wid(pTab) && !Is
1cb90 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
1cba0 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74  .      x = sqlit
1cbb0 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1cbc0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
1cbd0 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43  yIndex(pTab), iC
1cbe0 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ol);.    }.    s
1cbf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cc00 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c  (v, op, iTabCur,
1cc10 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d   x, regOut);.  }
1cc20 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29  .  if( iCol>=0 )
1cc30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  {.    sqlite3Col
1cc40 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
1cc50 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ab, iCol, regOut
1cc60 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1cc70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1cc80 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
1cc90 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
1cca0 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
1ccb0 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
1ccc0 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
1ccd0 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
1cce0 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66  r. .**.** An eff
1ccf0 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 73  ort is made to s
1cd00 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
1cd10 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
1cd20 72 20 69 52 65 67 2e 20 20 54 68 69 73 0a 2a 2a  r iReg.  This.**
1cd30 20 69 73 20 6e 6f 74 20 67 61 72 61 6e 74 65 65   is not garantee
1cd40 65 64 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e  ed for GetColumn
1cd50 28 29 20 2d 20 74 68 65 20 72 65 73 75 6c 74 20  () - the result 
1cd60 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
1cd70 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73 74 65 72  .** any register
1cd80 2e 20 20 42 75 74 20 74 68 65 20 72 65 73 75 6c  .  But the resul
1cd90 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
1cda0 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67 69 73  to land in regis
1cdb0 74 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72 20  ter iReg.** for 
1cdc0 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 29  GetColumnToReg()
1cdd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
1cde0 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75  st be an open cu
1cdf0 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20  rsor to pTab in 
1ce00 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73  iTable when this
1ce10 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
1ce20 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75  alled.  If iColu
1ce30 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69  mn<0 then code i
1ce40 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74  s generated that
1ce50 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f   extracts the ro
1ce60 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wid..*/.int sqli
1ce70 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1ce80 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
1ce90 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
1cea0 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
1ceb0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
1cec0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1ced0 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
1cee0 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
1cef0 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  e we are reading
1cf00 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1cf10 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49  Column,     /* I
1cf20 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
1cf30 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  e column */.  in
1cf40 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f  t iTable,      /
1cf50 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
1cf60 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62  nting to the tab
1cf70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
1cf80 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ,        /* Stor
1cf90 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
1cfa0 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20  /.  u8 p5       
1cfb0 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65       /* P5 value
1cfc0 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b   for OP_Column +
1cfd0 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56   FLAGS */.){.  V
1cfe0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1cff0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
1d000 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1d010 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69  che *p;..  for(i
1d020 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1d030 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
1d040 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
1d050 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
1d060 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62   p->iTable==iTab
1d070 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  le && p->iColumn
1d080 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
1d090 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
1d0a0 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
1d0b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1d0c0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
1d0d0 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52  er(pParse, p->iR
1d0e0 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  eg);.      retur
1d0f0 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  n p->iReg;.    }
1d100 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28  .  }  .  assert(
1d110 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
1d120 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1d130 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
1d140 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  ab, iTable, iCol
1d150 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66  umn, iReg);.  if
1d160 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( p5 ){.    sqli
1d170 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1d180 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b  v, p5);.  }else{
1d190 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45     .    sqlite3E
1d1a0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1d1b0 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43  arse, iTable, iC
1d1c0 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
1d1d0 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
1d1e0 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
1d1f0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1d200 54 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a  ToReg(.  Parse *
1d210 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
1d220 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1d230 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1d240 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1d250 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
1d260 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
1d270 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
1d280 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
1d290 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
1d2a0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
1d2b0 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
1d2c0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1d2d0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
1d2e0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
1d2f0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
1d300 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g         /* Sto
1d310 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
1d320 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  */.){.  int r1 =
1d330 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d340 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1d350 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c  , pTab, iColumn,
1d360 20 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30   iTable, iReg, 0
1d370 29 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65  );.  if( r1!=iRe
1d380 67 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  g ) sqlite3VdbeA
1d390 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
1d3a0 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  dbe, OP_SCopy, r
1d3b0 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a  1, iReg);.}.../*
1d3c0 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f  .** Clear all co
1d3d0 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69  lumn cache entri
1d3e0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1d3f0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
1d400 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  r(Parse *pParse)
1d410 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  {.  int i;..#ifd
1d420 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1d430 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
1d440 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1d450 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
1d460 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43  ){.    printf("C
1d470 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65  LEAR\n");.  }.#e
1d480 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ndif.  for(i=0; 
1d490 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1d4a0 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  che; i++){.    i
1d4b0 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  f( pParse->aColC
1d4c0 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67 0a  ache[i].tempReg.
1d4d0 20 20 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e       && pParse->
1d4e0 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
1d4f0 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
1d500 52 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  Reg).    ){.    
1d510 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
1d520 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
1d530 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65  pReg++] = pParse
1d540 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
1d550 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Reg;.    }.  }. 
1d560 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
1d570 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  he = 0;.}../*.**
1d580 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
1d590 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74   that an affinit
1d5a0 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63  y change has occ
1d5b0 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a  urred on iCount.
1d5c0 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61  ** registers sta
1d5d0 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72  rting with iStar
1d5e0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1d5f0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1d600 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20  ityChange(Parse 
1d610 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74  *pParse, int iSt
1d620 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29  art, int iCount)
1d630 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
1d640 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
1d650 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e  e, iStart, iCoun
1d660 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t);.}../*.** Gen
1d670 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  erate code to mo
1d680 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ve content from 
1d690 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
1d6a0 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
1d6b0 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
1d6c0 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20  To+nReg-1. Keep 
1d6d0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1d6e0 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a   up-to-date..*/.
1d6f0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1d700 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a  CodeMove(Parse *
1d710 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
1d720 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
1d730 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28  nReg){.  assert(
1d740 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67   iFrom>=iTo+nReg
1d750 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d   || iFrom+nReg<=
1d760 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTo );.  sqlite3
1d770 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
1d780 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76  e->pVdbe, OP_Mov
1d790 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e  e, iFrom, iTo, n
1d7a0 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Reg);.  sqlite3E
1d7b0 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1d7c0 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52  Parse, iFrom, nR
1d7d0 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  eg);.}..#if defi
1d7e0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1d7f0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1d800 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
1d810 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
1d820 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69  true if any regi
1d830 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67  ster in the rang
1d840 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e  e iFrom..iTo (in
1d850 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75  clusive).** is u
1d860 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
1d870 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
1d880 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1d890 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68  ine is used with
1d8a0 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20  in assert() and 
1d8b0 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
1d8c0 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f  s only.** and do
1d8d0 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
1d8e0 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e   a normal build.
1d8f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1d900 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1d910 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d920 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1d930 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  To){.  int i;.  
1d940 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1d950 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
1d960 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1d970 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  che; i<pParse->n
1d980 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70  ColCache; i++, p
1d990 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d  ++){.    int r =
1d9a0 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66   p->iReg;.    if
1d9b0 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c  ( r>=iFrom && r<
1d9c0 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b  =iTo ) return 1;
1d9d0 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
1d9e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1d9f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1da00 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49  TE_DEBUG || SQLI
1da10 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
1da20 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76   */.../*.** Conv
1da30 65 72 74 20 61 20 73 63 61 6c 61 72 20 65 78 70  ert a scalar exp
1da40 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20  ression node to 
1da50 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65  a TK_REGISTER re
1da60 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67  ferencing.** reg
1da70 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 65  ister iReg.  The
1da80 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
1da90 75 72 65 20 74 68 61 74 20 69 52 65 67 20 61 6c  ure that iReg al
1daa0 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  ready contains.*
1dab0 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  * the correct va
1dac0 6c 75 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  lue for the expr
1dad0 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ession..*/.stati
1dae0 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67  c void exprToReg
1daf0 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69  ister(Expr *p, i
1db00 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f  nt iReg){.  p->o
1db10 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d  p2 = p->op;.  p-
1db20 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
1db30 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  R;.  p->iTable =
1db40 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65   iReg;.  ExprCle
1db50 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  arProperty(p, EP
1db60 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Skip);.}../*.**
1db70 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   Evaluate an exp
1db80 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20  ression (either 
1db90 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
1dba0 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29  alar expression)
1dbb0 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68   and store.** th
1dbc0 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74  e result in cont
1dbd0 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72  inguous temporar
1dbe0 79 20 72 65 67 69 73 74 65 72 73 2e 20 20 52 65  y registers.  Re
1dbf0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1dc00 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72  f.** the first r
1dc10 65 67 69 73 74 65 72 20 75 73 65 64 20 74 6f 20  egister used to 
1dc20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1dc30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
1dc40 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72  eturned result r
1dc50 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
1dc60 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74  porary scalar, t
1dc70 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a  hen also write.*
1dc80 2a 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  * that register 
1dc90 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46  number into *piF
1dca0 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65  reeable.  If the
1dcb0 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74   returned result
1dcc0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20   register.** is 
1dcd0 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
1dce0 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73  or if the expres
1dcf0 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72  sion is a vector
1dd00 20 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65   set *piFreeable
1dd10 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61  .** to 0..*/.sta
1dd20 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65  tic int exprCode
1dd30 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50  Vector(Parse *pP
1dd40 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69  arse, Expr *p, i
1dd50 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b  nt *piFreeable){
1dd60 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a  .  int iResult;.
1dd70 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20    int nResult = 
1dd80 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
1dd90 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20  rSize(p);.  if( 
1dda0 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20  nResult==1 ){.  
1ddb0 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    iResult = sqli
1ddc0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ddd0 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65  pParse, p, piFre
1dde0 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  eable);.  }else{
1ddf0 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65  .    *piFreeable
1de00 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
1de10 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
1de20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  {.#if SQLITE_OMI
1de30 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
1de40 20 69 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23 65   iResult = 0;.#e
1de50 6c 73 65 0a 20 20 20 20 20 20 69 52 65 73 75 6c  lse.      iResul
1de60 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  t = sqlite3CodeS
1de70 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
1de80 20 70 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   p, 0, 0);.#endi
1de90 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
1dea0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1deb0 69 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65  iResult = pParse
1dec0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
1ded0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1dee0 6e 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66  nResult;.      f
1def0 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c  or(i=0; i<nResul
1df00 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; i++){.       
1df10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1df20 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61 72 73  Factorable(pPars
1df30 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  e, p->x.pList->a
1df40 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52 65  [i].pExpr, i+iRe
1df50 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sult);.      }. 
1df60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1df70 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f  n iResult;.}.../
1df80 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1df90 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  de into the curr
1dfa0 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c  ent Vdbe to eval
1dfb0 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a  uate the given.*
1dfc0 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41  * expression.  A
1dfd0 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20  ttempt to store 
1dfe0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72  the results in r
1dff0 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22  egister "target"
1e000 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
1e010 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72  register where r
1e020 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
1e030 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68  d..**.** With th
1e040 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72  is routine, ther
1e050 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65  e is no guarante
1e060 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77  e that results w
1e070 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64  ill.** be stored
1e080 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65   in target.  The
1e090 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65   result might be
1e0a0 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20   stored in some 
1e0b0 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65  other.** registe
1e0c0 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65  r if it is conve
1e0d0 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20  nient to do so. 
1e0e0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
1e0f0 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68  ction.** must ch
1e100 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63  eck the return c
1e110 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ode and move the
1e120 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20   results to the 
1e130 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73  desired.** regis
1e140 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1e150 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1e160 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
1e170 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1e180 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
1e190 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1e1a0 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d  Vdbe;  /* The VM
1e1b0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1e1c0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ion */.  int op;
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1e0 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
1e1f0 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
1e200 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61    int inReg = ta
1e210 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  rget;       /* R
1e220 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e  esults stored in
1e230 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20   register inReg 
1e240 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1e250 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  1 = 0;         /
1e260 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1e270 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1e280 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1e290 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1e2a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
1e2b0 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
1e2c0 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
1e2d0 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
1e2e0 31 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20 20  1, r2;          
1e2f0 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
1e300 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
1e310 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58   */.  Expr tempX
1e320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e330 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70  /* Temporary exp
1e340 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a  ression node */.
1e350 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20    int p5 = 0;.. 
1e360 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
1e370 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
1e380 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
1e390 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61  f( v==0 ){.    a
1e3a0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
1e3b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1e3c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1e3d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70  .  }..  if( pExp
1e3e0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d  r==0 ){.    op =
1e3f0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73   TK_NULL;.  }els
1e400 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70  e{.    op = pExp
1e410 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69  r->op;.  }.  swi
1e420 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1e430 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
1e440 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
1e450 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
1e460 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
1e470 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
1e480 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
1e490 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
1e4a0 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20  [pExpr->iAgg];. 
1e4b0 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e       if( !pAggIn
1e4c0 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29  fo->directMode )
1e4d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1e4e0 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29  ( pCol->iMem>0 )
1e4f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1e500 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
1e510 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67     }else if( pAg
1e520 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e  gInfo->useSortin
1e530 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  gIdx ){.        
1e540 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e550 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1e560 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e  pAggInfo->sortin
1e570 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20  gIdxPTab,.      
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e590 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
1e5a0 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72  orterColumn, tar
1e5b0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  get);.        re
1e5c0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e5d0 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74     }.      /* Ot
1e5e0 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
1e5f0 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43  ru into the TK_C
1e600 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20  OLUMN case */.  
1e610 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e620 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1e630 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72  int iTab = pExpr
1e640 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
1e650 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20  if( iTab<0 ){.  
1e660 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
1e670 2d 3e 69 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a  ->iSelfTab<0 ){.
1e680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
1e690 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f  erating CHECK co
1e6a0 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73  nstraints or ins
1e6b0 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74  erting into part
1e6c0 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ial index */.   
1e6d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45         return pE
1e6e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70  xpr->iColumn - p
1e6f0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b  Parse->iSelfTab;
1e700 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1e710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
1e720 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ing an expressio
1e730 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  n that is part o
1e740 66 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65  f an index where
1e750 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
1e760 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
1e770 65 20 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f  e index refer to
1e780 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68   the table to wh
1e790 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 62 65  ich the index be
1e7a0 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20  longs */.       
1e7b0 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65     iTab = pParse
1e7c0 2d 3e 69 53 65 6c 66 54 61 62 20 2d 20 31 3b 0a  ->iSelfTab - 1;.
1e7d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e7e0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  }.      return s
1e7f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1e800 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
1e810 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20  pExpr->pTab,.   
1e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e830 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1e840 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62  r->iColumn, iTab
1e850 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e870 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1e880 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  op2);.    }.    
1e890 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
1e8a0 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
1e8b0 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78  eger(pParse, pEx
1e8c0 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  pr, 0, target);.
1e8d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1e8e0 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
1e8f0 61 73 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45  ase TK_TRUEFALSE
1e900 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1e910 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e920 50 5f 49 6e 74 65 67 65 72 2c 20 73 71 6c 69 74  P_Integer, sqlit
1e930 65 33 45 78 70 72 54 72 75 74 68 4f 70 65 72 61  e3ExprTruthOpera
1e940 6e 64 28 70 45 78 70 72 29 2c 20 74 61 72 67 65  nd(pExpr), targe
1e950 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1e960 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1e970 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e980 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1e990 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
1e9a0 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
1e9b0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e9c0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e9d0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1e9e0 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
1e9f0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1ea00 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1ea10 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1ea20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1ea30 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
1ea40 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1ea50 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1ea60 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1ea70 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1ea80 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
1ea90 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
1eaa0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1eab0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1eac0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1ead0 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
1eae0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1eaf0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1eb00 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
1eb10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1eb20 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
1eb30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1eb40 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
1eb50 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
1eb60 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
1eb70 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1eb80 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *z;.      char *
1eb90 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73  zBlob;.      ass
1eba0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1ebb0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ebc0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1ebd0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1ebe0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1ebf0 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a  x' || pExpr->u.z
1ec00 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b  Token[0]=='X' );
1ec10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ec20 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1ec30 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1ec40 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a   z = &pExpr->u.z
1ec50 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20  Token[2];.      
1ec60 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
1ec70 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20  n30(z) - 1;.    
1ec80 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d    assert( z[n]==
1ec90 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42  '\'' );.      zB
1eca0 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
1ecb0 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
1ecc0 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
1ecd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ece0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
1ecf0 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
1ed00 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
1ed10 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65  NAMIC);.      re
1ed20 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1ed30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
1ed40 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
1ed50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ed60 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1ed70 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1ed80 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1ed90 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1eda0 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20  Token!=0 );.    
1edb0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1edc0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
1edd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ede0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1edf0 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
1ee00 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
1ee10 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
1ee20 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
1ee30 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  !=0 ){.        c
1ee40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
1ee50 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f  qlite3VListNumTo
1ee60 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c  Name(pParse->pVL
1ee70 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ist, pExpr->iCol
1ee80 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73  umn);.        as
1ee90 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1eea0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c  Token[0]=='?' ||
1eeb0 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
1eec0 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29  .zToken, z)==0 )
1eed0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
1eee0 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b  ->pVList[0] = 0;
1eef0 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69   /* Indicate VLi
1ef00 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72  st may no longer
1ef10 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1ef20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ef30 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
1ef40 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54  char*)z, P4_STAT
1ef50 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
1ef60 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1ef70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ef80 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
1ef90 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
1efa0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1efb0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1efc0 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
1efd0 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
1efe0 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1eff0 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
1f000 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
1f010 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
1f020 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1f030 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1f040 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f050 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
1f060 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1f070 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
1f080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f090 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
1f0a0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
1f0b0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
1f0c0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
1f0d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f0e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61  eAddOp2(v, OP_Ca
1f0f0 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  st, target,.    
1f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f110 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e      sqlite3Affin
1f120 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
1f130 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20  .zToken, 0));.  
1f140 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73      testcase( us
1f150 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
1f160 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69  pParse, inReg, i
1f170 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73  nReg) );.      s
1f180 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1f190 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1f1a0 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b  arse, inReg, 1);
1f1b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e  .      return in
1f1c0 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  Reg;.    }.#endi
1f1d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1f1e0 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
1f1f0 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
1f200 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
1f210 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
1f220 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
1f230 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53  NE;.      p5 = S
1f240 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
1f250 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f      /* fall-thro
1f260 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
1f270 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1f280 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1f290 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1f2a0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1f2b0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1f2c0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45  TK_EQ: {.      E
1f2d0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1f2e0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1f2f0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1f300 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20  IsVector(pLeft) 
1f310 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56  ){.        codeV
1f320 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61  ectorCompare(pPa
1f330 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1f340 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20  et, op, p5);.   
1f350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f360 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1f370 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f380 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72  e, pLeft, &regFr
1f390 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1f3a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f3b0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f3c0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1f3d0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1f3e0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1f3f0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78  arse, pLeft, pEx
1f400 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1f410 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1f420 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
1f430 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b  E_STOREP2 | p5);
1f440 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f450 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
1f460 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1f470 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1f480 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
1f490 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f4a0 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
1f4b0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1f4c0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1f4d0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
1f4e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f4f0 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
1f500 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1f510 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1f520 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
1f530 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f540 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
1f550 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1f560 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1f570 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
1f580 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f590 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
1f5a0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
1f5b0 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
1f5c0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
1f5d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f5e0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
1f5f0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
1f600 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1f610 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
1f620 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1f630 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f640 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f650 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1f660 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f670 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f680 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
1f690 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
1f6a0 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
1f6b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
1f6c0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
1f6d0 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
1f6e0 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
1f6f0 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
1f700 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
1f710 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
1f720 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
1f730 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
1f740 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
1f750 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
1f760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f770 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20  _AND==OP_And ); 
1f780 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1f790 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ase( op==TK_AND 
1f7a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f7b0 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1f7d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f  stcase( op==TK_O
1f7e0 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
1f7f0 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
1f800 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  dd );           
1f810 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f820 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61  _PLUS );.      a
1f830 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
1f840 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20  =OP_Subtract ); 
1f850 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f860 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
1f870 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
1f880 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
1f890 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1f8a0 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
1f8b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f8c0 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
1f8d0 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74  And );      test
1f8e0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1f8f0 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
1f900 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
1f910 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20  P_BitOr );      
1f920 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f930 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20  TK_BITOR );.    
1f940 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
1f950 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
1f960 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f970 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b   op==TK_SLASH );
1f980 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f990 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
1f9a0 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74  ftLeft );   test
1f9b0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48  case( op==TK_LSH
1f9c0 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
1f9d0 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
1f9e0 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
1f9f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fa00 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
1fa10 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
1fa20 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
1fa30 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1fa40 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
1fa50 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1fa60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1fa70 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1fa80 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1fa90 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1faa0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1fab0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1fac0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1fad0 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
1fae0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1faf0 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
1fb00 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
1fb10 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1fb20 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1fb30 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1fb40 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1fb50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1fb60 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
1fb70 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1fb80 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1fb90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
1fba0 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
1fbb0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
1fbc0 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
1fbd0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1fbe0 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74  rse, pLeft, 1, t
1fbf0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1fc00 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23  return target;.#
1fc10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fc20 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1fc30 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  T.      }else if
1fc40 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
1fc50 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
1fc60 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1fc70 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1fc80 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1fc90 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
1fca0 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54  l(v, pLeft->u.zT
1fcb0 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  oken, 1, target)
1fcc0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1fcd0 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a   target;.#endif.
1fce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fcf0 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20       tempX.op = 
1fd00 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TK_INTEGER;.    
1fd10 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20      tempX.flags 
1fd20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
1fd30 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20  _TokenOnly;.    
1fd40 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c      tempX.u.iVal
1fd50 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ue = 0;.        
1fd60 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1fd70 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1fd80 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
1fd90 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  e1);.        r2 
1fda0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fdb0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1fdc0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1fdd0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
1fde0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fdf0 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
1fe00 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1fe10 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1fe20 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1fe30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1fe40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1fe50 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
1fe60 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
1fe70 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
1fe80 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
1fe90 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65  P_BitNot );   te
1fea0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1feb0 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61  ITNOT );.      a
1fec0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f  ssert( TK_NOT==O
1fed0 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20  P_Not );        
1fee0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fef0 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  K_NOT );.      r
1ff00 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1ff10 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ff20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1ff30 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1ff40 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1ff50 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  e1==0 );.      s
1ff60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ff70 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65  (v, op, r1, inRe
1ff80 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
1ff90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ffa0 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20  TK_TRUTH: {.    
1ffb0 20 20 69 6e 74 20 69 73 54 72 75 65 3b 0a 20 20    int isTrue;.  
1ffc0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1ffd0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1ffe0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1fff0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
20000 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
20010 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
20020 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c      isTrue = sql
20030 69 74 65 33 45 78 70 72 54 72 75 74 68 4f 70 65  ite3ExprTruthOpe
20040 72 61 6e 64 28 70 45 78 70 72 2d 3e 70 52 69 67  rand(pExpr->pRig
20050 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ht);.      sqlit
20060 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
20070 76 2c 20 4f 50 5f 49 73 54 72 75 65 2c 20 72 31  v, OP_IsTrue, r1
20080 2c 20 69 6e 52 65 67 2c 20 21 69 73 54 72 75 65  , inReg, !isTrue
20090 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 54               isT
200b0 72 75 65 20 5e 20 28 70 45 78 70 72 2d 3e 6f 70  rue ^ (pExpr->op
200c0 32 3d 3d 54 4b 5f 49 53 29 29 3b 0a 20 20 20 20  2==TK_IS));.    
200d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
200e0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
200f0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
20100 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
20110 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
20120 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
20130 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
20140 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20150 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
20160 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
20170 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
20180 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
20190 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
201a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
201b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
201c0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
201d0 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  t);.      r1 = s
201e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
201f0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
20200 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
20210 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
20220 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
20230 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
20240 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20250 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20  p1(v, op, r1);. 
20260 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
20270 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
20280 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
20290 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
202a0 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
202b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
202c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
202d0 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74  teger, 0, target
202e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
202f0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
20300 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65  addr);.      bre
20310 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20320 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
20330 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  ON: {.      AggI
20340 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78  nfo *pInfo = pEx
20350 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
20360 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30      if( pInfo==0
20370 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
20380 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
20390 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
203a0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
203b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
203c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
203d0 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
203e0 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e  : %s()", pExpr->
203f0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
20400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20410 72 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46  return pInfo->aF
20420 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  unc[pExpr->iAgg]
20430 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  .iMem;.      }. 
20440 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20450 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  }.    case TK_FU
20460 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
20470 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b  ExprList *pFarg;
20480 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
20490 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
204a0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
204b0 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20  t nFarg;        
204c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
204d0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
204e0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75  ents */.      Fu
204f0 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
20500 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
20510 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  tion definition 
20520 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  object */.      
20530 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
20540 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
20550 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
20560 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61       u32 constMa
20570 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d  sk = 0;     /* M
20580 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ask of function 
20590 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61  arguments that a
205a0 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20  re constant */. 
205b0 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
205c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
205d0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
205e0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
205f0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
20600 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
20610 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
20620 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
20630 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  (db);      /* Th
20640 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
20650 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74  used by this dat
20660 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
20670 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
20680 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61  0;    /* A colla
20690 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
206a0 0a 0a 20 20 20 20 20 20 69 66 28 20 43 6f 6e 73  ..      if( Cons
206b0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
206c0 29 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  ) && sqlite3Expr
206d0 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
206e0 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
206f0 20 20 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74      /* SQL funct
20700 69 6f 6e 73 20 63 61 6e 20 62 65 20 65 78 70 65  ions can be expe
20710 6e 73 69 76 65 2e 20 53 6f 20 74 72 79 20 74 6f  nsive. So try to
20720 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e 74 20 66   move constant f
20730 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 20  unctions.       
20740 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 69   ** out of the i
20750 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76 65 6e 20  nner loop, even 
20760 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 61 6e  if that means an
20770 20 65 78 74 72 61 20 4f 50 5f 43 6f 70 79 2e 20   extra OP_Copy. 
20780 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
20790 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
207a0 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
207b0 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 20 20  pExpr, -1);.    
207c0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
207d0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
207e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
207f0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
20800 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
20810 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
20820 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
20830 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
20840 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20850 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
20860 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
20870 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67     }.      nFarg
20880 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67   = pFarg ? pFarg
20890 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
208a0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
208b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
208c0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
208d0 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70  );.      zId = p
208e0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
208f0 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
20900 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
20910 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c  (db, zId, nFarg,
20920 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65 66   enc, 0);.#ifdef
20930 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
20940 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54  NKNOWN_SQL_FUNCT
20950 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70 44  ION.      if( pD
20960 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  ef==0 && pParse-
20970 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
20980 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
20990 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
209a0 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46  b, "unknown", nF
209b0 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  arg, enc, 0);.  
209c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
209d0 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c     if( pDef==0 |
209e0 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a  | pDef->xFinaliz
209f0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
20a00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20a10 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
20a20 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22   function: %s()"
20a30 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
20a40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
20a50 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
20a60 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d   a direct implem
20a70 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
20a80 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43  built-in COALESC
20a90 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  E() and.      **
20aa0 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69   IFNULL() functi
20ab0 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ons.  This avoid
20ac0 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76  s unnecessary ev
20ad0 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20  aluation of.    
20ae0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70    ** arguments p
20af0 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f  ast the first no
20b00 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  n-NULL argument.
20b10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20b20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
20b30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
20b40 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
20b50 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
20b60 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
20b70 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20b80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20b90 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
20ba0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20bb0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
20bc0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
20bd0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
20be0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
20bf0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
20c00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20c10 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
20c20 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
20c30 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
20c40 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
20c50 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
20c60 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
20c70 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61  emove(pParse, ta
20c80 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rget, 1);.      
20c90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20ca0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
20cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
20cc0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
20cd0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
20ce0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
20cf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20d00 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
20d10 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  arse);.        }
20d20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20d30 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
20d40 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  (v, endCoalesce)
20d50 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
20d60 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
20d70 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28  /* The UNLIKELY(
20d80 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  ) function is a 
20d90 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75  no-op.  The resu
20da0 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a  lt is the value.
20db0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
20dc0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
20dd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
20de0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
20df0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
20e00 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20  _UNLIKELY ){.   
20e10 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
20e20 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg>=1 );.       
20e30 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
20e40 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
20e50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
20e60 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
20e70 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65  ;.      }..#ifde
20e80 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
20e90 20 20 20 20 20 2f 2a 20 54 68 65 20 41 46 46 49       /* The AFFI
20ea0 4e 49 54 59 28 29 20 66 75 6e 63 74 69 6f 6e 20  NITY() function 
20eb0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20 73  evaluates to a s
20ec0 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
20ed0 69 62 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ibes.      ** th
20ee0 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  e type affinity 
20ef0 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  of the argument.
20f00 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
20f10 6f 72 20 74 65 73 74 69 6e 67 20 6f 66 0a 20 20  or testing of.  
20f20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74      ** the SQLit
20f30 65 20 74 79 70 65 20 6c 6f 67 69 63 2e 0a 20 20  e type logic..  
20f40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
20f50 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
20f60 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 41   & SQLITE_FUNC_A
20f70 46 46 49 4e 49 54 59 20 29 7b 0a 20 20 20 20 20  FFINITY ){.     
20f80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
20f90 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f 62  zAff[] = { "blob
20fa0 22 2c 20 22 74 65 78 74 22 2c 20 22 6e 75 6d 65  ", "text", "nume
20fb0 72 69 63 22 2c 20 22 69 6e 74 65 67 65 72 22 2c  ric", "integer",
20fc0 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20 20 20 20   "real" };.     
20fd0 20 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 20     char aff;.   
20fe0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
20ff0 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg==1 );.       
21000 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78   aff = sqlite3Ex
21010 70 72 41 66 66 69 6e 69 74 79 28 70 46 61 72 67  prAffinity(pFarg
21020 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
21030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21040 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
21050 74 61 72 67 65 74 2c 20 0a 20 20 20 20 20 20 20  target, .       
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21070 20 20 20 20 20 20 20 61 66 66 20 3f 20 61 7a 41         aff ? azA
21080 66 66 5b 61 66 66 2d 53 51 4c 49 54 45 5f 41 46  ff[aff-SQLITE_AF
21090 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65 22  F_BLOB] : "none"
210a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
210b0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
210c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
210d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67  for(i=0; i<nFarg
210e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
210f0 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69  if( i<32 && sqli
21100 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
21110 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  t(pFarg->a[i].pE
21120 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
21130 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33    testcase( i==3
21140 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
21150 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  onstMask |= MASK
21160 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20  BIT32(i);.      
21170 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
21180 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
21190 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
211a0 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21  EEDCOLL)!=0 && !
211b0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
211c0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
211d0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
211e0 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
211f0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
21200 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21210 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20    if( pFarg ){. 
21220 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74         if( const
21230 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  Mask ){.        
21240 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e    r1 = pParse->n
21250 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  Mem+1;.         
21260 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
21270 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20   nFarg;.        
21280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21290 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
212a0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
212b0 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
212c0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
212d0 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64  For length() and
212e0 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69   typeof() functi
212f0 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d  ons with a colum
21300 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20  n argument,.    
21310 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50      ** set the P
21320 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  5 parameter to t
21330 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
21340 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45  ode to OPFLAG_LE
21350 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20  NGTHARG.        
21360 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50  ** or OPFLAG_TYP
21370 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76  EOFARG respectiv
21380 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e  ely, to avoid un
21390 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20  necessary data. 
213a0 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e         ** loadin
213b0 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  g..        */.  
213c0 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
213d0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51  >funcFlags & (SQ
213e0 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
213f0 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50  |SQLITE_FUNC_TYP
21400 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  EOF))!=0 ){.    
21410 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b        u8 exprOp;
21420 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
21430 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20  t( nFarg==1 );. 
21440 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21450 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21460 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
21470 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72     exprOp = pFar
21480 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
21490 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  p;.          if(
214a0 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55   exprOp==TK_COLU
214b0 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b  MN || exprOp==TK
214c0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  _AGG_COLUMN ){. 
214d0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
214e0 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  t( SQLITE_FUNC_L
214f0 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45  ENGTH==OPFLAG_LE
21500 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
21510 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
21520 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f  QLITE_FUNC_TYPEO
21530 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  F==OPFLAG_TYPEOF
21540 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
21550 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
21560 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f  f->funcFlags & O
21570 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
21580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
21590 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
215a0 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20  ->op2 = .       
215b0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d             pDef-
215c0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50  >funcFlags & (OP
215d0 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f  FLAG_LENGTHARG|O
215e0 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29  PFLAG_TYPEOFARG)
215f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21600 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
21610 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
21620 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20  ePush(pParse);  
21630 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
21640 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
21650 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21660 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
21670 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20  rse, pFarg, r1, 
21680 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216a0 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
216b0 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  UP|SQLITE_ECEL_F
216c0 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20 20  ACTOR);.        
216d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
216e0 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20 20  Pop(pParse);    
216f0 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
21700 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
21710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21720 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   r1 = 0;.      }
21730 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21740 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
21750 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69  E.      /* Possi
21760 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65  bly overload the
21770 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65   function if the
21780 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
21790 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69  is.      ** a vi
217a0 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75  rtual table colu
217b0 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  mn..      **.   
217c0 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20     ** For infix 
217d0 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c  functions (LIKE,
217e0 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61   GLOB, REGEXP, a
217f0 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68  nd MATCH) use th
21800 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  e.      ** secon
21810 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20  d argument, not 
21820 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68  the first, as th
21830 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65  e argument to te
21840 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  st to.      ** s
21850 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f  ee if it is a co
21860 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61  lumn in a virtua
21870 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  l table.  This i
21880 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20  s done because. 
21890 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74       ** the left
218a0 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69   operand of infi
218b0 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65  x functions (the
218c0 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74   operand we want
218d0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   to.      ** con
218e0 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67  trol overloading
218f0 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65  ) ends up as the
21900 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
21910 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
21920 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
21930 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c  expression "A gl
21940 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c  ob B" is equival
21950 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
21960 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65   "glob(B,A).  We
21970 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65   want to use the
21980 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22   A in "A glob B"
21990 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a   to test.      *
219a0 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f  * for function o
219b0 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74  verloading.  But
219c0 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65   we use the B te
219d0 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29  rm in "glob(B,A)
219e0 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
219f0 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26    if( nFarg>=2 &
21a00 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  & (pExpr->flags 
21a10 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20  & EP_InfixFunc) 
21a20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
21a30 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
21a40 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
21a50 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
21a60 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  Farg->a[1].pExpr
21a70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
21a80 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20  f( nFarg>0 ){.  
21a90 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
21aa0 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
21ab0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
21ac0 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
21ad0 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
21ae0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21af0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
21b00 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
21b10 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
21b20 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
21b30 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
21b40 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20  ->pDfltColl; .  
21b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21b60 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
21b70 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20  llSeq, 0, 0, 0, 
21b80 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
21b90 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
21ba0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
21bb0 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f  E_ENABLE_OFFSET_
21bc0 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20 69  SQL_FUNC.      i
21bd0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
21be0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
21bf0 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20 20 20 20  _OFFSET ){.     
21c00 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20     Expr *pArg = 
21c10 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
21c20 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  r;.        if( p
21c30 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  Arg->op==TK_COLU
21c40 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
21c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21c60 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c 20  3(v, OP_Offset, 
21c70 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70 41  pArg->iTable, pA
21c80 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72  rg->iColumn, tar
21c90 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  get);.        }e
21ca0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
21cb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21cc0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
21cd0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
21ce0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23   }.      }else.#
21cf0 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
21d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21d10 65 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72 73  eAddOp4(v, pPars
21d20 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f 50  e->iSelfTab ? OP
21d30 5f 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50 5f  _PureFunc0 : OP_
21d40 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20 20  Function0,.     
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d60 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20       constMask, 
21d70 72 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68 61  r1, target, (cha
21d80 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43  r*)pDef, P4_FUNC
21d90 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71  DEF);.        sq
21da0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
21db0 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b  5(v, (u8)nFarg);
21dc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21dd0 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73  f( nFarg && cons
21de0 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  tMask==0 ){.    
21df0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
21e00 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
21e10 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a  se, r1, nFarg);.
21e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
21e30 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
21e40 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
21e50 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
21e60 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
21e70 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
21e80 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
21e90 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
21ea0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
21eb0 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
21ec0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
21ed0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
21ee0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
21ef0 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70  ECT && (nCol = p
21f00 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
21f10 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21  >pEList->nExpr)!
21f20 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
21f30 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
21f40 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  ror(pParse, nCol
21f50 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
21f60 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
21f70 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  n sqlite3CodeSub
21f80 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
21f90 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Expr, 0, 0);.   
21fa0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
21fb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
21fc0 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
21fd0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  N: {.      int n
21fe0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
21ff0 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65  r->pLeft->iTable
22000 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
22010 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61  Expr->pLeft->iTa
22020 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ble = sqlite3Cod
22030 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
22040 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
22050 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
22060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
22070 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
22080 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  | pExpr->pLeft->
22090 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
220a0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
220b0 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
220c0 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
220d0 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  !=(n = sqlite3Ex
220e0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
220f0 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20  pr->pLeft)) .   
22100 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
22110 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
22120 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e  arse, "%d column
22130 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61  s assigned %d va
22140 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lues",.         
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22160 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
22170 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  able, n);.      
22180 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
22190 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61  Expr->pLeft->iTa
221a0 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f  ble + pExpr->iCo
221b0 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lumn;.    }.    
221c0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
221d0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
221e0 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
221f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22200 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
22210 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
22220 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22240 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
22250 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
22260 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22270 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
22280 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
22290 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
222a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
222b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
222c0 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
222d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
222e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
222f0 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
22300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22310 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22320 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
22330 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
22340 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
22350 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
22360 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
22370 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
22380 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
22390 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
223a0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
223b0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
223c0 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  D z.    **.    *
223d0 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  * This is equiva
223e0 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20  lent to.    **. 
223f0 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
22400 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20  D x<=z.    **.  
22410 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64    ** X is stored
22420 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
22430 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74  ..    ** Y is st
22440 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
22450 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
22460 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74  ..    ** Z is st
22470 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
22480 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
22490 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
224a0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
224b0 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
224c0 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
224d0 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  xpr, target, 0, 
224e0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
224f0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
22500 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a     case TK_SPAN:
22510 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
22520 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20  LATE: .    case 
22530 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
22540 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
22550 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
22560 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
22570 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
22580 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
22590 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20  _TRIGGER: {.    
225a0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f    /* If the opco
225b0 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52  de is TK_TRIGGER
225c0 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
225d0 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72  ssion is a refer
225e0 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ence.      ** to
225f0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
22600 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
22610 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76  pseudo-tables av
22620 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  ailable to.     
22630 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
22640 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  rams. In this ca
22650 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69  se Expr.iTable i
22660 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74  s set to 1 for t
22670 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  he.      ** new.
22680 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
22690 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64  or 0 for the old
226a0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
226b0 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20   Expr.iColumn.  
226c0 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
226d0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   the column of t
226e0 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  he pseudo-table 
226f0 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d  to read, or to -
22700 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  1 to.      ** re
22710 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  ad the rowid fie
22720 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ld..      **.   
22730 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73     ** The expres
22740 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  sion is implemen
22750 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f  ted using an OP_
22760 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68  Param opcode. Th
22770 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61  e p1.      ** pa
22780 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74  rameter is set t
22790 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72  o 0 for an old.r
227a0 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
227b0 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20  or to (i+1).    
227c0 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63    ** to referenc
227d0 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  e another column
227e0 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73   of the old.* ps
227f0 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72  eudo-table, wher
22800 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73  e .      ** i is
22810 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
22820 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20  e column. For a 
22830 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65  new.rowid refere
22840 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20  nce, p1 is.     
22850 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29   ** set to (n+1)
22860 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65  , where n is the
22870 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
22880 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64  ns in each pseud
22890 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  o-table..      *
228a0 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63  * For a referenc
228b0 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63  e to any other c
228c0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
228d0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
228e0 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20   p1.      ** is 
228f0 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20  set to (n+2+i), 
22900 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72  where n and i ar
22910 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65  e as defined pre
22920 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20  viously. For.   
22930 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69     ** example, i
22940 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77  f the table on w
22950 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72  hich triggers ar
22960 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73  e being fired is
22970 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72  .      ** declar
22980 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
22990 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
229a0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
229b0 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ;.      **.     
229c0 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69   ** Then p1 is i
229d0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
229e0 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  llows:.      **.
229f0 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30        **   p1==0
22a00 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77     ->    old.row
22a10 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d  id     p1==3   -
22a20 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20  >    new.rowid. 
22a30 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20       **   p1==1 
22a40 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20    ->    old.a   
22a50 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e        p1==4   ->
22a60 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20      new.a.      
22a70 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20  **   p1==2   -> 
22a80 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20     old.b        
22a90 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e   p1==5   ->    n
22aa0 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20  ew.b       .    
22ab0 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
22ac0 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e   *pTab = pExpr->
22ad0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
22ae0 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  p1 = pExpr->iTab
22af0 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c  le * (pTab->nCol
22b00 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d  +1) + 1 + pExpr-
22b10 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20  >iColumn;..     
22b20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
22b30 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
22b40 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  pr->iTable==1 );
22b50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22b60 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d  Expr->iColumn>=-
22b70 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  1 && pExpr->iCol
22b80 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  umn<pTab->nCol )
22b90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22ba0 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c  pTab->iPKey<0 ||
22bb0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
22bc0 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a  =pTab->iPKey );.
22bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
22be0 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d  >=0 && p1<(pTab-
22bf0 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20  >nCol*2+2) );.. 
22c00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22c10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72  AddOp2(v, OP_Par
22c20 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b  am, p1, target);
22c30 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
22c40 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e  nt((v, "%s.%s ->
22c50 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28   $%d",.        (
22c60 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
22c70 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a  "new" : "old"),.
22c80 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
22c90 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77  iColumn<0 ? "row
22ca0 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61  id" : pExpr->pTa
22cb0 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
22cc0 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a  Column].zName),.
22cd0 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20          target. 
22ce0 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65       ));..#ifnde
22cf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
22d00 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
22d10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
22d20 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66  umn has REAL aff
22d30 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75  inity, it may cu
22d40 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
22d50 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a  d as an.      **
22d60 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50   integer. Use OP
22d70 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f  _RealAffinity to
22d80 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
22d90 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20   really real..  
22da0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
22db0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
22dc0 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74  0985-57662 SQLit
22dd0 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  e will convert t
22de0 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f  he value back to
22df0 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  .      ** floati
22e00 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78  ng point when ex
22e10 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d  tracting it from
22e20 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f   the record.  */
22e30 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
22e40 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20  ->iColumn>=0 .  
22e50 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43       && pTab->aC
22e60 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
22e70 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  n].affinity==SQL
22e80 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20  ITE_AFF_REAL.   
22e90 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
22ea0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
22eb0 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  v, OP_RealAffini
22ec0 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ty, target);.   
22ed0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
22ee0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
22ef0 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54      case TK_VECT
22f00 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OR: {.      sqli
22f10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22f20 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
22f30 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20  isused");.      
22f40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
22f50 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c    case TK_IF_NUL
22f60 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69  L_ROW: {.      i
22f70 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20  nt addrINR;.    
22f80 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69    addrINR = sqli
22f90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
22fa0 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70   OP_IfNullRow, p
22fb0 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
22fc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22fd0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
22fe0 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
22ff0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23000 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
23010 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
23020 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
23030 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
23040 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
23050 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
23060 72 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a  re(v, addrINR);.
23070 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23080 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
23090 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20  rINR, inReg);.  
230a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
230b0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
230c0 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20  Form A:.    **  
230d0 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20   CASE x WHEN e1 
230e0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
230f0 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
23100 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
23110 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
23120 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20    ** Form B:.   
23130 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
23140 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
23150 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
23160 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
23170 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
23180 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69  .    ** Form A i
23190 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f  s can be transfo
231a0 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71  rmed into the eq
231b0 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20  uivalent form B 
231c0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
231d0 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78  **   CASE WHEN x
231e0 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =e1 THEN r1 WHEN
231f0 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e   x=e2 THEN r2 ..
23200 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
23210 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72  WHEN x=eN THEN r
23220 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
23230 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66   **.    ** X (if
23240 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
23250 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
23260 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74      ** Y is in t
23270 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20  he last element 
23280 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  of pExpr->x.pLis
23290 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t if pExpr->x.pL
232a0 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20  ist->nExpr is.  
232b0 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59    ** odd.  The Y
232c0 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61   is also optiona
232d0 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65  l.  If the numbe
232e0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
232f0 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20   x.pList.    ** 
23300 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20  is even, then Y 
23310 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74  is omitted and t
23320 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72  he "otherwise" r
23330 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20  esult is NULL.. 
23340 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70     ** Ei is in p
23350 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
23360 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45  *2] and Ri is pE
23370 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
23380 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  2+1]..    **.   
23390 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   ** The result o
233a0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
233b0 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74   is the Ri for t
233c0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
233d0 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  g Ei,.    ** or 
233e0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
233f0 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20  atching Ei, the 
23400 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20  ELSE term Y, or 
23410 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  if there is.    
23420 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c  ** no ELSE term,
23430 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
23440 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
23450 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29  t( op==TK_CASE )
23460 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e  ; {.      int en
23470 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  dLabel;         
23480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
23490 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e  OTO label for en
234a0 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a  d of CASE stmt *
234b0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74  /.      int next
234c0 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Case;           
234d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
234e0 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74  O label for next
234f0 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
23500 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
23510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23520 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75          /* 2x nu
23530 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72  mber of WHEN ter
23540 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ms */.      int 
23550 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
23560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23570 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
23580 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
23590 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
235a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
235b0 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
235c0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
235d0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c  xprList_item *aL
235e0 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72  istelem;  /* Arr
235f0 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  ay of WHEN terms
23600 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f   */.      Expr o
23610 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20  pCompare;       
23620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23630 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73  he X==Ei express
23640 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
23650 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23670 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69  * The X expressi
23680 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
23690 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20   *pTest = 0;    
236a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
236b0 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20   X==Ei (form A) 
236c0 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d  or just Ei (form
236d0 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41   B) */.      VVA
236e0 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68  _ONLY( int iCach
236f0 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  eLevel = pParse-
23700 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a  >iCacheLevel; ).
23710 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
23720 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23730 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
23740 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78  ect) && pExpr->x
23750 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  .pList );.      
23760 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e  assert(pExpr->x.
23770 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
23780 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
23790 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
237a0 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
237b0 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
237c0 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
237d0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
237e0 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c    endLabel = sql
237f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
23800 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l(v);.      if( 
23810 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  (pX = pExpr->pLe
23820 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ft)!=0 ){.      
23830 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20    tempX = *pX;. 
23840 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23850 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pX->op==TK_COLU
23860 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78  MN );.        ex
23870 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74 65  prToRegister(&te
23880 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63  mpX, exprCodeVec
23890 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65 6d  tor(pParse, &tem
238a0 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  pX, &regFree1));
238b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
238c0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
238d0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
238e0 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20  (&opCompare, 0, 
238f0 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65  sizeof(opCompare
23900 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  ));.        opCo
23910 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
23920 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
23930 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d  are.pLeft = &tem
23940 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73  pX;.        pTes
23950 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a  t = &opCompare;.
23960 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65          /* Ticke
23970 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66  t b351d95f9cd5ef
23980 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61  17e9d9dbae18f5ca
23990 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20  8611190001:.    
239a0 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65      ** The value
239b0 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67   in regFree1 mig
239c0 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20  ht get SCopy-ed 
239d0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65  into the file re
239e0 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  sult..        **
239f0 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   So make sure th
23a00 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20  at the regFree1 
23a10 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20  register is not 
23a20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72  reused for other
23a30 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70  .        ** purp
23a40 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c  oses and possibl
23a50 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  y overwritten.  
23a60 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  */.        regFr
23a70 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ee1 = 0;.      }
23a80 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
23a90 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32  i<nExpr-1; i=i+2
23aa0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23ab0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
23ac0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
23ad0 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
23ae0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
23af0 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
23b00 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
23b10 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
23b20 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
23b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23b40 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
23b50 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
23b60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23b70 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
23b80 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
23b90 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
23ba0 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
23bb0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
23bc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23bd0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
23be0 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
23bf0 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
23c00 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
23c10 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
23c20 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
23c30 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
23c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
23c50 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
23c60 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
23c70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
23c80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23c90 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62  beGoto(v, endLab
23ca0 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
23cb0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
23cc0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
23cd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
23ce0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
23cf0 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
23d00 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72        if( (nExpr
23d10 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
23d20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
23d30 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
23d40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
23d50 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
23d60 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d  pEList->a[nExpr-
23d70 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
23d80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
23d90 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
23da0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65  Parse);.      }e
23db0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
23dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23dd0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
23de0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
23df0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
23e00 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
23e10 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
23e20 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20  >nErr>0 .       
23e30 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69      || pParse->i
23e40 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63  CacheLevel==iCac
23e50 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20  heLevel );.     
23e60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
23e70 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c  lveLabel(v, endL
23e80 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  abel);.      bre
23e90 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
23ea0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
23eb0 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
23ec0 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
23ed0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
23ee0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c  affinity==OE_Rol
23ef0 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20  lback .         
23f00 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
23f10 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20  nity==OE_Abort. 
23f20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
23f30 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
23f40 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20  _Fail.          
23f50 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
23f60 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20  ity==OE_Ignore. 
23f70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
23f80 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  ( !pParse->pTrig
23f90 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20  gerTab ){.      
23fa0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23fb0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fd0 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
23fe0 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
23ff0 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
24000 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
24010 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
24020 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
24030 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41  ->affinity==OE_A
24040 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
24050 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
24060 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
24070 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
24080 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
24090 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
240a0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ue) );.      if(
240b0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
240c0 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  ==OE_Ignore ){. 
240d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
240e0 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
240f0 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74        v, OP_Halt
24100 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f  , SQLITE_OK, OE_
24110 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72  Ignore, 0, pExpr
24120 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20  ->u.zToken,0);. 
24130 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
24140 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65  age(v);.      }e
24150 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
24160 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
24170 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  nt(pParse, SQLIT
24180 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
24190 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  GGER,.          
241a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241b0 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
241c0 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ity, pExpr->u.zT
241d0 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  oken, 0, 0);.   
241e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61     }..      brea
241f0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
24200 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
24210 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
24220 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
24230 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
24240 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
24250 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75  egFree2);.  retu
24260 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
24270 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68  ** Factor out th
24280 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69  e code of the gi
24290 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ven expression t
242a0 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
242b0 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   time..**.** If 
242c0 72 65 67 44 65 73 74 3e 3d 30 20 74 68 65 6e 20  regDest>=0 then 
242d0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  the result is al
242e0 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ways stored in t
242f0 68 61 74 20 72 65 67 69 73 74 65 72 20 61 6e 64  hat register and
24300 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69   the.** result i
24310 73 20 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e 20  s not reusable. 
24320 20 49 66 20 72 65 67 44 65 73 74 3c 30 20 74 68   If regDest<0 th
24330 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
24340 69 73 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73  is free to .** s
24350 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 77  tore the value w
24360 68 65 72 65 65 76 65 72 20 69 74 20 77 61 6e 74  hereever it want
24370 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  s.  The register
24380 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65   where the expre
24390 73 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f  ssion .** is sto
243a0 72 65 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e  red is returned.
243b0 20 20 57 68 65 6e 20 72 65 67 44 65 73 74 3c 30    When regDest<0
243c0 2c 20 74 77 6f 20 69 64 65 6e 74 69 63 61 6c 20  , two identical 
243d0 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c  expressions will
243e0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68 65 20  .** code to the 
243f0 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  same register..*
24400 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
24410 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50  rCodeAtInit(.  P
24420 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
24430 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
24440 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
24450 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
24460 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
24470 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56 44  code when the VD
24480 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a  BE initializes *
24490 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74 20  /.  int regDest 
244a0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
244b0 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73  he value in this
244c0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
244d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20    ExprList *p;. 
244e0 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61   assert( ConstFa
244f0 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
24500 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
24510 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69 66  pConstExpr;.  if
24520 28 20 72 65 67 44 65 73 74 3c 30 20 26 26 20 70  ( regDest<0 && p
24530 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
24540 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
24550 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  tem;.    int i;.
24560 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d      for(pItem=p-
24570 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20  >a, i=p->nExpr; 
24580 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d  i>0; pItem++, i-
24590 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  -){.      if( pI
245a0 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26  tem->reusable &&
245b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
245c0 61 72 65 28 30 2c 70 49 74 65 6d 2d 3e 70 45 78  are(0,pItem->pEx
245d0 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20  pr,pExpr,-1)==0 
245e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
245f0 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73  n pItem->u.iCons
24600 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20  tExprReg;.      
24610 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  }.    }.  }.  pE
24620 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
24630 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
24640 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20   pExpr, 0);.  p 
24650 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
24660 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
24670 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  p, pExpr);.  if(
24680 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63   p ){.     struc
24690 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
246a0 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
246b0 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
246c0 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
246d0 20 3d 20 72 65 67 44 65 73 74 3c 30 3b 0a 20 20   = regDest<0;.  
246e0 20 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30     if( regDest<0
246f0 20 29 20 72 65 67 44 65 73 74 20 3d 20 2b 2b 70   ) regDest = ++p
24700 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
24710 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73    pItem->u.iCons
24720 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65  tExprReg = regDe
24730 73 74 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  st;.  }.  pParse
24740 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70  ->pConstExpr = p
24750 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 44 65  ;.  return regDe
24760 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  st;.}../*.** Gen
24770 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
24780 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
24790 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  sion and store t
247a0 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
247b0 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  to a register.  
247c0 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
247d0 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
247e0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
247f0 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
24800 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65  * If the registe
24810 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
24820 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
24830 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65  an be deallocate
24840 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  d,.** then write
24850 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f   its number into
24860 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20   *pReg.  If the 
24870 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
24880 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70  is not.** a temp
24890 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20  orary, then set 
248a0 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pReg to zero..*
248b0 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
248c0 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65   a constant, the
248d0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
248e0 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68  ight generate th
248f0 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69  is.** code to fi
24900 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ll the register 
24910 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  in the initializ
24920 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66  ation section of
24930 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
24940 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74  gram, in order t
24950 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20  o factor it out 
24960 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  of the evaluatio
24970 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  n loop..*/.int s
24980 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
24990 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mp(Parse *pParse
249a0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
249b0 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74  nt *pReg){.  int
249c0 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   r2;.  pExpr = s
249d0 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
249e0 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
249f0 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  if( ConstFactorO
24a00 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20  k(pParse).   && 
24a10 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
24a20 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c  GISTER.   && sql
24a30 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
24a40 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29  ntNotJoin(pExpr)
24a50 0a 20 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20  .  ){.    *pReg 
24a60 20 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d 20 73   = 0;.    r2 = s
24a70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
24a80 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
24a90 70 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  pr, -1);.  }else
24aa0 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73  {.    int r1 = s
24ab0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
24ac0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32  (pParse);.    r2
24ad0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24ae0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
24af0 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
24b00 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
24b10 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b       *pReg = r1;
24b20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24b30 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
24b40 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
24b50 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67  r1);.      *pReg
24b60 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
24b70 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a    return r2;.}..
24b80 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
24b90 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
24ba0 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
24bb0 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
24bc0 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
24bd0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
24be0 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
24bf0 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
24c00 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
24c10 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
24c20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24c30 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
24c40 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
24c50 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
24c60 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  ){.  int inReg;.
24c70 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
24c80 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
24c90 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
24ca0 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45   if( pExpr && pE
24cb0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
24cc0 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69  STER ){.    sqli
24cd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
24ce0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
24cf0 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61  Copy, pExpr->iTa
24d00 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ble, target);.  
24d10 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67  }else{.    inReg
24d20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24d30 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
24d40 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
24d50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24d60 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c  rse->pVdbe!=0 ||
24d70 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
24d80 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
24d90 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
24da0 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56  et && pParse->pV
24db0 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  dbe ){.      sql
24dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
24dd0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
24de0 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
24df0 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arget);.    }.  
24e00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
24e10 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79  a transient copy
24e20 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
24e30 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f  Expr and then co
24e40 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73  de it using.** s
24e50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
24e60 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
24e70 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
24e80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
24e90 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74  ).** except that
24ea0 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65   the input expre
24eb0 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74  ssion is guarant
24ec0 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e  eed to be unchan
24ed0 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ged..*/.void sql
24ee0 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
24ef0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24f00 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
24f10 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69   target){.  sqli
24f20 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
24f30 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  ->db;.  pExpr = 
24f40 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
24f50 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
24f60 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
24f70 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45  ailed ) sqlite3E
24f80 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
24f90 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
24fa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
24fb0 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
24fc0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
24fd0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
24fe0 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
24ff0 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
25000 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
25010 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
25020 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
25030 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
25040 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
25050 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
25060 67 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70  get.  If the exp
25070 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
25080 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
25090 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
250a0 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74  choose to code t
250b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  he expression at
250c0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
250d0 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
250e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63  lite3ExprCodeFac
250f0 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70  torable(Parse *p
25100 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
25110 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
25120 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f  .  if( pParse->o
25130 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20  kConstFactor && 
25140 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
25150 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
25160 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25170 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
25180 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
25190 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
251a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
251b0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
251c0 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rget);.  }.}../*
251d0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
251e0 65 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73  e that evaluates
251f0 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
25200 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74  ssion and puts t
25210 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  he result.** in 
25220 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
25230 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65  .**.** Also make
25240 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
25250 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74  xpression result
25260 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22  s into another "
25270 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a  cache" register.
25280 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68  ** and modify th
25290 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20  e expression so 
252a0 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69  that the next ti
252b0 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  me it is evaluat
252c0 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  ed,.** the resul
252d0 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  t is a copy of t
252e0 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65  he cache registe
252f0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
25300 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
25310 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  r expressions th
25320 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74  at are used mult
25330 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20  iple .** times. 
25340 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61   They are evalua
25350 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65  ted once and the
25360 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
25370 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72  expression.** ar
25380 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69  e reused..*/.voi
25390 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
253a0 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20  eAndCache(Parse 
253b0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
253c0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
253d0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
253e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
253f0 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73  int iMem;..  ass
25400 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
25410 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
25420 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
25430 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  R );.  sqlite3Ex
25440 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
25450 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
25460 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
25470 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
25480 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
25490 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20  P_Copy, target, 
254a0 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52  iMem);.  exprToR
254b0 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69  egister(pExpr, i
254c0 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mem);.}../*.** G
254d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
254e0 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
254f0 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
25500 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
25510 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
25520 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65  ist into a seque
25530 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
25540 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61   beginning at ta
25550 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  rget..**.** Retu
25560 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
25570 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61   elements evalua
25580 74 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ted.  The number
25590 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 0a 2a   returned will.*
255a0 2a 20 75 73 75 61 6c 6c 79 20 62 65 20 70 4c 69  * usually be pLi
255b0 73 74 2d 3e 6e 45 78 70 72 20 62 75 74 20 6d 69  st->nExpr but mi
255c0 67 68 74 20 62 65 20 72 65 64 75 63 65 64 20 69  ght be reduced i
255d0 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d  f SQLITE_ECEL_OM
255e0 49 54 52 45 46 0a 2a 2a 20 69 73 20 64 65 66 69  ITREF.** is defi
255f0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ned..**.** The S
25600 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66  QLITE_ECEL_DUP f
25610 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65  lag prevents the
25620 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20   arguments from 
25630 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20  being.** filled 
25640 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20  using OP_SCopy. 
25650 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65   OP_Copy must be
25660 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
25670 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
25680 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75  ECEL_FACTOR argu
25690 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73  ment allows cons
256a0 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74  tant arguments t
256b0 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64  o be.** factored
256c0 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61   out into initia
256d0 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a  lization code..*
256e0 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
256f0 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65  ECEL_REF flag me
25700 61 6e 73 20 74 68 61 74 20 65 78 70 72 65 73 73  ans that express
25710 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ions in the list
25720 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73   with.** ExprLis
25730 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  t.a[].u.x.iOrder
25740 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72  ByCol>0 have alr
25750 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61  eady been evalua
25760 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a  ted and stored.*
25770 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 61  * in registers a
25780 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f  t srcReg, and so
25790 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62   the value can b
257a0 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68  e copied from th
257b0 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ere..** If SQLIT
257c0 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 69  E_ECEL_OMITREF i
257d0 73 20 61 6c 73 6f 20 73 65 74 2c 20 74 68 65 6e  s also set, then
257e0 20 74 68 65 20 76 61 6c 75 65 73 20 77 69 74 68   the values with
257f0 20 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c   u.x.iOrderByCol
25800 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d 70 6c 79  >0.** are simply
25810 20 6f 6d 69 74 74 65 64 20 72 61 74 68 65 72 20   omitted rather 
25820 74 68 61 6e 20 62 65 69 6e 67 20 63 6f 70 69 65  than being copie
25830 64 20 66 72 6f 6d 20 73 72 63 52 65 67 2e 0a 2a  d from srcReg..*
25840 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
25850 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20  rCodeExprList(. 
25860 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
25870 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
25880 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
25890 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
258a0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
258b0 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65   list to be code
258c0 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65  d */.  int targe
258d0 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  t,        /* Whe
258e0 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75  re to write resu
258f0 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  lts */.  int src
25900 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
25910 6f 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20  ource registers 
25920 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  if SQLITE_ECEL_R
25930 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73  EF */.  u8 flags
25940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
25950 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67  LITE_ECEL_* flag
25960 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  s */.){.  struct
25970 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
25980 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pItem;.  int i, 
25990 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f  j, n;.  u8 copyO
259a0 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c  p = (flags & SQL
259b0 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20  ITE_ECEL_DUP) ? 
259c0 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f  OP_Copy : OP_SCo
259d0 70 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  py;.  Vdbe *v = 
259e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
259f0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
25a00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
25a10 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
25a20 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
25a30 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76  be!=0 );  /* Nev
25a40 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72  er gets this far
25a50 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
25a60 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
25a70 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61  ;.  if( !ConstFa
25a80 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
25a90 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
25aa0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20  E_ECEL_FACTOR;. 
25ab0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
25ac0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69  ->a, i=0; i<n; i
25ad0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
25ae0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
25af0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
25b00 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
25b10 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21  QLITE_ECEL_REF)!
25b20 3d 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d  =0 && (j = pItem
25b30 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
25b40 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l)>0 ){.      if
25b50 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
25b60 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b  _ECEL_OMITREF ){
25b70 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20  .        i--;.  
25b80 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
25b90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25ba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25bb0 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73  2(v, copyOp, j+s
25bc0 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b  rcReg-1, target+
25bd0 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
25be0 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
25bf0 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46   & SQLITE_ECEL_F
25c00 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c  ACTOR)!=0 && sql
25c10 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
25c20 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  nt(pExpr) ){.   
25c30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
25c40 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
25c50 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
25c60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25c70 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20      int inReg = 
25c80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
25c90 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
25ca0 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
25cb0 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
25cc0 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20  =target+i ){.   
25cd0 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
25ce0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
25cf0 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  pyOp==OP_Copy.  
25d00 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73         && (pOp=s
25d10 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
25d20 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
25d30 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
25d40 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70    && pOp->p1+pOp
25d50 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20  ->p3+1==inReg.  
25d60 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
25d70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72  2+pOp->p3+1==tar
25d80 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b  get+i.        ){
25d90 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
25da0 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  p3++;.        }e
25db0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
25dc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
25dd0 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65  (v, copyOp, inRe
25de0 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
25df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25e00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25e10 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
25e20 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
25e30 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
25e40 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
25e50 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
25e60 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
25e70 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
25e80 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
25e90 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
25ea0 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
25eb0 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
25ec0 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
25ed0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
25ee0 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  imination of x..
25ef0 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49  **.** The xJumpI
25f00 66 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65  f parameter dete
25f10 72 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a  rmines details:.
25f20 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20  **.**    NULL:  
25f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f40 20 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65   Store the boole
25f50 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  an result in reg
25f60 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c  [dest].**    sql
25f70 69 74 65 33 45 78 70 72 49 66 54 72 75 65 3a 20  ite3ExprIfTrue: 
25f80 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73       Jump to des
25f90 74 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20  t if true.**    
25fa0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
25fb0 73 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20  se:     Jump to 
25fc0 64 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a  dest if false.**
25fd0 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75  .** The jumpIfNu
25fe0 6c 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ll parameter is 
25ff0 69 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70  ignored if xJump
26000 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  If is NULL..*/.s
26010 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
26020 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61  odeBetween(.  Pa
26030 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
26040 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
26050 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
26060 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
26070 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
26080 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70   The BETWEEN exp
26090 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
260a0 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
260b0 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
260c0 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f  on or storage lo
260d0 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  cation */.  void
260e0 20 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a   (*xJump)(Parse*
260f0 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c  ,Expr*,int,int),
26100 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61   /* Action to ta
26110 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  ke */.  int jump
26120 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b  IfNull    /* Tak
26130 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
26140 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c  e BETWEEN is NUL
26150 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78  L */.){. Expr ex
26160 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68  prAnd;     /* Th
26170 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69  e AND operator i
26180 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a  n  x>=y AND x<=z
26190 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70    */.  Expr comp
261a0 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  Left;    /* The 
261b0 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20   x>=y  term */. 
261c0 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
261d0 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20     /* The  x<=z 
261e0 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
261f0 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20  exprX;       /* 
26200 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65  The  x  subexpre
26210 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ssion */.  int r
26220 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20  egFree1 = 0; /* 
26230 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
26240 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65  gister */...  me
26250 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20  mset(&compLeft, 
26260 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
26270 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70  ;.  memset(&comp
26280 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66  Right, 0, sizeof
26290 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65  (Expr));.  memse
262a0 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73  t(&exprAnd, 0, s
262b0 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20  izeof(Expr));.. 
262c0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
262d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
262e0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
262f0 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78  ;.  exprX = *pEx
26300 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70  pr->pLeft;.  exp
26310 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
26320 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66  ;.  exprAnd.pLef
26330 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
26340 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
26350 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
26360 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
26370 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  _GE;.  compLeft.
26380 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
26390 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
263a0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
263b0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
263c0 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
263d0 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69   TK_LE;.  compRi
263e0 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
263f0 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  rX;.  compRight.
26400 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
26410 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
26420 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  xpr;.  exprToReg
26430 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 65 78  ister(&exprX, ex
26440 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
26450 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
26460 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20  gFree1));.  if( 
26470 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75  xJump ){.    xJu
26480 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  mp(pParse, &expr
26490 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
264a0 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
264b0 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  .    /* Mark the
264c0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62   expression is b
264d0 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e  eing from the ON
264e0 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
264f0 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a   of a join.    *
26500 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 71  * so that the sq
26510 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
26520 67 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69  get() routine wi
26530 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
26540 6f 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74  o move.    ** it
26550 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e   into the Parse.
26560 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e  pConstExpr list.
26570 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20    We should use 
26580 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68  a new bit for th
26590 69 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63  is,.    ** for c
265a0 6c 61 72 69 74 79 2c 20 62 75 74 20 77 65 20 61  larity, but we a
265b0 72 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69  re out of bits i
265c0 6e 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73  n the Expr.flags
265d0 20 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20   field so we.   
265e0 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73   ** have to reus
265f0 65 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  e the EP_FromJoi
26600 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20  n bit.  Bummer. 
26610 2a 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61  */.    exprX.fla
26620 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69  gs |= EP_FromJoi
26630 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  n;.    sqlite3Ex
26640 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
26650 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
26660 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  est);.  }.  sqli
26670 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
26680 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
26690 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  e1);..  /* Ensur
266a0 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20  e adequate test 
266b0 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65  coverage */.  te
266c0 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
266d0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
266e0 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d    && jumpIfNull=
266f0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
26700 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26710 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26720 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
26730 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
26740 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
26750 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26760 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
26770 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
26780 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
26790 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
267a0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
267b0 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
267c0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
267d0 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
267e0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
267f0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26800 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
26810 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
26820 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
26830 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
26840 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
26850 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
26860 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
26870 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
26880 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
26890 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
268a0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
268b0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
268c0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
268d0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
268e0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
268f0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
26900 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
26910 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xJump==0 );.}../
26920 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
26930 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
26940 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
26950 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
26960 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
26970 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
26980 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
26990 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
269a0 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
269b0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
269c0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
269d0 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
269e0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
269f0 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
26a00 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
26a10 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
26a20 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
26a30 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
26a40 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53  IfNull flag is S
26a50 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
26a60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64  ..**.** This cod
26a70 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
26a80 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61   fact that certa
26a90 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  in token values 
26aa0 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61  (ex: TK_EQ).** a
26ab0 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f  re the same as o
26ac0 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78  pcode values (ex
26ad0 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d  : OP_Eq) that im
26ae0 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72  plement the corr
26af0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65  esponding.** ope
26b00 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c  ration.  Special
26b10 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62   comments in vdb
26b20 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70  e.c and the mkop
26b30 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
26b40 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20   in.** the make 
26b50 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68  process cause th
26b60 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c  ese values to al
26b70 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20  ign.  Assert()s 
26b80 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62  in the code.** b
26b90 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  elow verify that
26ba0 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65   the numbers are
26bb0 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74   aligned correct
26bc0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
26bd0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61  te3ExprIfTrue(Pa
26be0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
26bf0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
26c00 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
26c10 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
26c20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
26c30 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
26c40 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
26c50 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
26c60 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
26c70 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
26c80 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
26c90 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
26ca0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
26cb0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
26cc0 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b  0) )     return;
26cd0 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f    /* Existence o
26ce0 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
26cf0 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
26d00 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
26d10 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
26d20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  No way this can 
26d30 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d  happen */.  op =
26d40 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
26d50 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
26d60 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
26d70 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
26d80 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
26d90 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
26da0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
26db0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
26dc0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26dd0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26de0 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
26df0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
26e00 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
26e10 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
26e20 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
26e30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26e40 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
26e50 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
26e60 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
26e70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26e80 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
26e90 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d2);.      sqlit
26ea0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
26eb0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
26ec0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
26ed0 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
26ee0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
26ef0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
26f00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26f10 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26f20 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
26f30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
26f40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26f50 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
26f60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26f70 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
26f80 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
26f90 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
26fa0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
26fb0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
26fc0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
26fd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
26fe0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
26ff0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
27000 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
27010 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27020 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
27030 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
27040 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
27050 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27060 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27070 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69  TRUTH: {.      i
27080 6e 74 20 69 73 4e 6f 74 3b 0a 20 20 20 20 20 20  nt isNot;.      
27090 69 6e 74 20 69 73 54 72 75 65 3b 0a 20 20 20 20  int isTrue;.    
270a0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
270b0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
270c0 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72     isNot = pExpr
270d0 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b  ->op2==TK_ISNOT;
270e0 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20  .      isTrue = 
270f0 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
27100 4f 70 65 72 61 6e 64 28 70 45 78 70 72 2d 3e 70  Operand(pExpr->p
27110 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65  Right);.      te
27120 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26  stcase( isTrue &
27130 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20  & isNot );.     
27140 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75   testcase( isTru
27150 65 20 26 26 20 21 69 73 4e 6f 74 20 29 3b 0a 20  e && !isNot );. 
27160 20 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20       if( isTrue 
27170 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20  ^ isNot ){.     
27180 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27190 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
271a0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
271b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
271c0 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
271d0 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   ? SQLITE_JUMPIF
271e0 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20  NULL : 0);.     
271f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27200 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27210 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
27220 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20  ->pLeft, dest,. 
27230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27240 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20            isNot 
27250 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ? SQLITE_JUMPIFN
27260 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ULL : 0);.      
27270 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
27280 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
27290 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
272a0 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
272b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
272c0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
272d0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
272e0 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
272f0 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
27300 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
27310 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
27320 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
27330 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
27340 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
27350 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
27360 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
27370 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
27380 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
27390 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
273a0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _EQ: {.      if(
273b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
273c0 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  ctor(pExpr->pLef
273d0 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c  t) ) goto defaul
273e0 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65  t_expr;.      te
273f0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27400 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
27410 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
27420 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
27430 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
27440 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
27450 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
27460 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
27470 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
27480 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
27490 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
274a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
274b0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
274c0 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
274d0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
274e0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
274f0 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
27500 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
27510 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
27520 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
27530 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
27540 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
27550 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
27560 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
27570 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
27580 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
27590 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
275a0 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
275b0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
275c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
275d0 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
275e0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
275f0 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
27600 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
27610 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27620 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
27630 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
27640 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
27650 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
27660 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
27670 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
27680 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
27690 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
276a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
276b0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
276c0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
276d0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
276e0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
276f0 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
27700 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
27710 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27720 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
27730 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
27740 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
27750 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27760 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
27770 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
27780 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
27790 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
277a0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
277b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
277c0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
277d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
277e0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
277f0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
27800 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
27810 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
27820 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
27830 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
27840 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
27850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
27860 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
27870 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
27880 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
27890 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
278a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
278b0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
278c0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
278d0 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
278e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
278f0 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
27900 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27910 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
27920 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
27930 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27940 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
27950 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27960 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
27970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27980 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
27990 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
279a0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
279b0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
279c0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
279d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
279e0 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
279f0 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e  rIfTrue, jumpIfN
27a00 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
27a10 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
27a20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
27a30 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
27a40 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
27a50 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
27a60 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
27a70 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
27a80 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
27a90 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73  jumpIfNull ? des
27aa0 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b  t : destIfFalse;
27ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27ac0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
27ad0 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
27ae0 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
27af0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27b00 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
27b10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27b20 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
27b30 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
27b40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27b50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
27b60 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65  efault: {.    de
27b70 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20  fault_expr:.    
27b80 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
27b90 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
27ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27bb0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
27bc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
27bd0 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
27be0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
27bf0 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20     /* No-op */. 
27c00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27c10 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
27c20 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
27c30 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
27c40 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
27c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27c60 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
27c70 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
27c80 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  !=0);.        Vd
27c90 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
27ca0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27cb0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
27cc0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27cd0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
27ce0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27cf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27d00 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
27d10 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
27d20 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
27d30 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
27d40 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
27d50 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a  Free2);  .}../*.
27d60 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
27d70 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
27d80 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
27d90 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
27da0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
27db0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
27dc0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
27dd0 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
27de0 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
27df0 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
27e00 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
27e10 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
27e20 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
27e30 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
27e40 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
27e50 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
27e60 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
27e70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45  IfNull is SQLITE
27e80 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66  _JUMPIFNULL or f
27e90 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
27ea0 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20  umpIfNull.** is 
27eb0 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
27ec0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
27ed0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
27ee0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
27ef0 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
27f00 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
27f10 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
27f20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
27f30 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
27f40 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
27f50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
27f60 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
27f70 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
27f80 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
27f90 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
27fa0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
27fb0 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  0) ) return; /* 
27fc0 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
27fd0 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
27fe0 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ler */.  if( pEx
27ff0 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72  pr==0 )    retur
28000 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
28010 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
28020 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
28030 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
28040 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
28050 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
28060 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
28070 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
28080 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
28090 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
280a0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
280b0 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
280c0 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
280d0 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
280e0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
280f0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
28100 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
28110 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
28120 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
28130 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
28140 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
28150 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
28160 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
28170 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
28180 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
28190 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
281a0 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
281b0 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
281c0 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
281d0 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
281e0 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
281f0 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
28200 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
28210 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
28220 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
28230 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
28240 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
28250 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
28260 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
28270 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
28280 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
28290 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
282a0 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
282b0 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
282c0 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
282d0 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
282e0 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
282f0 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
28300 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
28310 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
28320 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
28330 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
28340 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
28350 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
28360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
28370 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
28380 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
28390 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
283a0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
283b0 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
283c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
283d0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
283e0 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
283f0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28400 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
28410 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
28420 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
28430 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
28440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
28450 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
28460 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
28470 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28480 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
28490 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
284a0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
284b0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
284c0 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  D: {.      testc
284d0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
284e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
284f0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
28500 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28510 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
28520 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
28530 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
28540 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
28550 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
28560 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
28570 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
28580 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
28590 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
285a0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
285b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
285c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
285d0 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
285e0 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
285f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
28600 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28610 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28620 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28630 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
28640 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
28650 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
28660 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
28670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28680 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
28690 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
286a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
286b0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
286c0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
286d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
286e0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
286f0 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
28700 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
28710 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
28720 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
28730 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
28740 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
28750 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
28760 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
28770 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
28780 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28790 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
287a0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
287b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
287c0 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b  case TK_TRUTH: {
287d0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74  .      int isNot
287e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72  ;.      int isTr
287f0 75 65 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ue;.      testca
28800 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
28810 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
28820 74 28 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54  t( pExpr->op2==T
28830 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
28840 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  p2==TK_ISNOT );.
28850 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45        isNot = pE
28860 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e  xpr->op2==TK_ISN
28870 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65  OT;.      isTrue
28880 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72   = sqlite3ExprTr
28890 75 74 68 4f 70 65 72 61 6e 64 28 70 45 78 70 72  uthOperand(pExpr
288a0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
288b0 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75   testcase( isTru
288c0 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
288d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
288e0 54 72 75 65 20 26 26 20 21 69 73 4e 6f 74 20 29  True && !isNot )
288f0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72  ;.      if( isTr
28900 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20  ue ^ isNot ){.  
28910 20 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45        /* IS TRUE
28920 20 61 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c 53   and IS NOT FALS
28930 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  E */.        sql
28940 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
28950 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28960 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30         isNot ? 0
28990 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   : SQLITE_JUMPIF
289a0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d 65  NULL);..      }e
289b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
289c0 49 53 20 46 41 4c 53 45 20 61 6e 64 20 49 53 20  IS FALSE and IS 
289d0 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20  NOT TRUE */.    
289e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
289f0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
28a00 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
28a10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28a20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
28a30 74 20 3f 20 30 3a 20 53 51 4c 49 54 45 5f 4a 55  t ? 0: SQLITE_JU
28a40 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
28a50 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
28a60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
28a70 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
28a80 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
28a90 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
28aa0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
28ab0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
28ac0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
28ad0 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
28ae0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
28af0 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
28b00 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  Q;.      jumpIfN
28b10 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
28b20 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
28b30 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
28b40 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
28b50 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
28b60 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
28b70 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
28b80 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
28b90 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
28ba0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
28bb0 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
28bc0 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
28bd0 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
28be0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
28bf0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
28c00 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
28c10 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
28c20 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
28c30 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
28c40 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
28c50 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
28c60 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
28c70 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
28c80 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
28c90 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
28ca0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
28cb0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
28cd0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
28ce0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
28cf0 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
28d00 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
28d10 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
28d20 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
28d30 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
28d40 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
28d50 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
28d60 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
28d70 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
28d80 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
28d90 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
28da0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
28db0 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
28dc0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
28dd0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
28de0 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
28df0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
28e00 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
28e10 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
28e20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
28e30 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
28e40 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
28e50 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
28e60 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
28e70 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
28e80 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
28e90 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
28ea0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
28eb0 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
28ec0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
28ed0 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
28ee0 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
28ef0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
28f00 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
28f10 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
28f20 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
28f30 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
28f40 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
28f50 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
28f60 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
28f70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
28f80 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
28f90 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
28fa0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
28fb0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
28fc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
28fd0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
28fe0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
28ff0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
29000 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
29010 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
29020 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
29030 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
29040 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
29050 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
29060 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
29070 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
29080 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20  p==TK_ISNULL ); 
29090 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
290a0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
290b0 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
290c0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
290d0 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LL );  VdbeCover
290e0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
290f0 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
29100 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
29110 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
29120 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
29130 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
29140 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
29150 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
29160 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
29170 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
29180 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
29190 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
291a0 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
291b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
291c0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
291d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
291e0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
291f0 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
29200 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
29210 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
29220 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
29230 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
29240 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29250 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
29260 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
29270 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
29280 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
29290 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
292a0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
292b0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
292c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
292d0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
292e0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
292f0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
29300 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
29310 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
29320 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20  default_expr: . 
29330 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
29340 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
29350 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
29360 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
29370 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
29380 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
29390 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
293a0 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
293b0 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
293c0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
293d0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
293e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
293f0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
29400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29410 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
29420 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
29430 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
29440 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
29450 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
29460 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
29470 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
29480 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
29490 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
294a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
294b0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
294c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
294d0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
294e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
294f0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
29500 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
29510 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
29520 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29  te3ExprIfFalse()
29530 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63   except that a c
29540 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70  opy is made of p
29550 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63  Expr before.** c
29560 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20  ode generation, 
29570 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73  and that copy is
29580 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63   deleted after c
29590 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
295a0 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20  This.** ensures 
295b0 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
295c0 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61  l pExpr is uncha
295d0 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
295e0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
295f0 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Dup(Parse *pPars
29600 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
29610 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d  int dest,int jum
29620 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69  pIfNull){.  sqli
29630 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
29640 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43  ->db;.  Expr *pC
29650 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
29660 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
29670 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
29680 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
29690 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
296a0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
296b0 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d  pCopy, dest, jum
296c0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
296d0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
296e0 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a  e(db, pCopy);.}.
296f0 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f  ./*.** Expressio
29700 6e 20 70 56 61 72 20 69 73 20 67 75 61 72 61 6e  n pVar is guaran
29710 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 53 51  teed to be an SQ
29720 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45 78 70  L variable. pExp
29730 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a 2a 20  r may be any.** 
29740 74 79 70 65 20 6f 66 20 65 78 70 72 65 73 73 69  type of expressi
29750 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  on..**.** If pEx
29760 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53  pr is a simple S
29770 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20 69 6e  QL value - an in
29780 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74 72  teger, real, str
29790 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20  ing, blob.** or 
297a0 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74 68 65  NULL value - the
297b0 6e 20 74 68 65 20 56 44 42 45 20 63 75 72 72 65  n the VDBE curre
297c0 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65 70 61  ntly being prepa
297d0 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65  red is configure
297e0 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65 70 61  d.** to re-prepa
297f0 72 65 20 65 61 63 68 20 74 69 6d 65 20 61 20 6e  re each time a n
29800 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f 75 6e  ew value is boun
29810 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56  d to variable pV
29820 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69  ar..**.** Additi
29830 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78 70 72  onally, if pExpr
29840 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c   is a simple SQL
29850 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 76   value and the v
29860 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20 73  alue is the.** s
29870 61 6d 65 20 61 73 20 74 68 61 74 20 63 75 72 72  ame as that curr
29880 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20 76  ently bound to v
29890 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20 6e 6f  ariable pVar, no
298a0 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
298b0 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ed..** Otherwise
298c0 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 73 20  , if the values 
298d0 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d 65  are not the same
298e0 20 6f 72 20 69 66 20 70 45 78 70 72 20 69 73 20   or if pExpr is 
298f0 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  not a simple.** 
29900 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72 6f 20  SQL value, zero 
29910 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
29920 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
29930 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 50  ompareVariable(P
29940 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
29950 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72 20 2a  pr *pVar, Expr *
29960 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65  pExpr){.  int re
29970 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  s = 0;.  int iVa
29980 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  r;.  sqlite3_val
29990 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20 30 3b  ue *pL, *pR = 0;
299a0 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  .  .  sqlite3Val
299b0 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
299c0 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51  e->db, pExpr, SQ
299d0 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
299e0 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70 52 29  E_AFF_BLOB, &pR)
299f0 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a 20 20  ;.  if( pR ){.  
29a00 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d 3e 69    iVar = pVar->i
29a10 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
29a20 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
29a30 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  k(pParse->pVdbe,
29a40 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c 20 3d   iVar);.    pL =
29a50 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42   sqlite3VdbeGetB
29a60 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72 73 65  oundValue(pParse
29a70 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69 56  ->pReprepare, iV
29a80 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ar, SQLITE_AFF_B
29a90 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  LOB);.    if( pL
29aa0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
29ab0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
29ac0 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58  (pL)==SQLITE_TEX
29ad0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
29ae0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
29af0 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  pL); /* Make sur
29b00 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69  e the encoding i
29b10 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20  s UTF-8 */.     
29b20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 20   }.      res =  
29b30 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  0==sqlite3MemCom
29b40 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30 29 3b  pare(pL, pR, 0);
29b50 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
29b60 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 29 3b  e3ValueFree(pR);
29b70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
29b80 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a  eFree(pL);.  }..
29b90 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
29ba0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
29bb0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
29bc0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
29bd0 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ees.  Return 0 i
29be0 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
29bf0 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d  ressions are com
29c00 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61  pletely identica
29c10 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  l.  Return 1 if 
29c20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79  they differ only
29c30 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  .** by a COLLATE
29c40 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65   operator at the
29c50 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74   top level.  Ret
29c60 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61  urn 2 if there a
29c70 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a  re differences.*
29c80 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  * other than the
29c90 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41   top-level COLLA
29ca0 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  TE operator..**.
29cb0 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
29cc0 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
29cd0 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
29ce0 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
29cf0 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
29d00 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
29d10 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
29d20 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
29d30 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
29d40 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65  *.** The pA side
29d50 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20   might be using 
29d60 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66  TK_REGISTER.  If
29d70 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
29d80 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e  e and pB is.** n
29d90 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  ot using TK_REGI
29da0 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65  STER but is othe
29db0 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74  rwise equivalent
29dc0 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74  , then still ret
29dd0 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  urn 0..**.** Som
29de0 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
29df0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
29e00 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  2 even if the tw
29e10 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
29e20 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
29e30 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
29e40 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
29e50 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
29e60 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
29e70 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a  l, we return 2 j
29e80 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
29e90 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
29ea0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32  ine.** returns 2
29eb0 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
29ec0 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
29ed0 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
29ee0 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
29ef0 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
29f00 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
29f10 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72  t a 0 or 1 retur
29f20 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
29f30 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
29f40 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
29f50 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
29f60 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
29f70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
29f80 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
29f90 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
29fa0 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74  n extra 2 - that
29fb0 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
29fc0 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
29fd0 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
29fe0 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
29ff0 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
2a000 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20  ct 0 or 1 could 
2a010 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
2a020 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
2a030 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55  pParse is not NU
2a040 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52 49 41  LL then TK_VARIA
2a050 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70 41 20  BLE terms in pA 
2a060 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20 69 6e  with bindings in
2a070 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52 65 70  .** pParse->pRep
2a080 72 65 70 61 72 65 20 63 61 6e 20 62 65 20 6d 61  repare can be ma
2a090 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 6c 69  tched against li
2a0a0 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20 20 54  terals in pB.  T
2a0b0 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70  he .** pParse->p
2a0c0 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 62 69  Vdbe->expmask bi
2a0d0 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74 65 64  tmask is updated
2a0e0 20 66 6f 72 20 65 61 63 68 20 76 61 72 69 61 62   for each variab
2a0f0 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a  le referenced..*
2a100 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 4e  * If pParse is N
2a110 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61 6c 20  ULL (the normal 
2a120 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79 20 54  case) then any T
2a130 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 20  K_VARIABLE term 
2a140 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  in .** Argument 
2a150 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20 6e 6f  pParse should no
2a160 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e 20  rmally be NULL. 
2a170 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
2a180 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a 20 70  L and pA or.** p
2a190 42 20 63 61 75 73 65 73 20 61 20 72 65 74 75 72  B causes a retur
2a1a0 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f  n value of 2..*/
2a1b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2a1c0 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70  Compare(Parse *p
2a1d0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 41 2c  Parse, Expr *pA,
2a1e0 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69   Expr *pB, int i
2a1f0 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62  Tab){.  u32 comb
2a200 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28  inedFlags;.  if(
2a210 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
2a220 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
2a230 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20  ==pA ? 0 : 2;.  
2a240 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 20 26  }.  if( pParse &
2a250 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  & pA->op==TK_VAR
2a260 49 41 42 4c 45 20 26 26 20 65 78 70 72 43 6f 6d  IABLE && exprCom
2a270 70 61 72 65 56 61 72 69 61 62 6c 65 28 70 50 61  pareVariable(pPa
2a280 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29 7b 0a  rse, pA, pB) ){.
2a290 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2a2a0 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  }.  combinedFlag
2a2b0 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20  s = pA->flags | 
2a2c0 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  pB->flags;.  if(
2a2d0 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
2a2e0 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
2a2f0 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61      if( (pA->fla
2a300 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f  gs&pB->flags&EP_
2a310 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20  IntValue)!=0 && 
2a320 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42  pA->u.iValue==pB
2a330 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20  ->u.iValue ){.  
2a340 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2a350 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
2a360 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
2a370 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20  op!=pB->op ){.  
2a380 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
2a390 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
2a3a0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a3b0 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
2a3c0 2c 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20  ,pB,iTab)<2 ){. 
2a3d0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2a3e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d     }.    if( pB-
2a3f0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
2a400 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
2a410 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41  mpare(pParse, pA
2a420 2c 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29  ,pB->pLeft,iTab)
2a430 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
2a440 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2a450 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
2a460 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
2a470 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21  OLUMN && pA->op!
2a480 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26  =TK_AGG_COLUMN &
2a490 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  & pA->u.zToken )
2a4a0 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
2a4b0 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  ==TK_FUNCTION ){
2a4c0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2a4d0 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e  e3StrICmp(pA->u.
2a4e0 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
2a4f0 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ken)!=0 ) return
2a500 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
2a510 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a  ( strcmp(pA->u.z
2a520 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
2a530 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  en)!=0 ){.      
2a540 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54  return pA->op==T
2a550 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20  K_COLLATE ? 1 : 
2a560 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
2a570 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
2a580 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
2a590 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
2a5a0 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
2a5b0 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   2;.  if( ALWAYS
2a5c0 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ((combinedFlags 
2a5d0 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d  & EP_TokenOnly)=
2a5e0 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63  =0) ){.    if( c
2a5f0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
2a600 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65  P_xIsSelect ) re
2a610 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
2a620 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a630 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70  re(pParse, pA->p
2a640 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  Left, pB->pLeft,
2a650 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
2a660 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
2a670 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2a680 61 72 73 65 2c 20 70 41 2d 3e 70 52 69 67 68 74  arse, pA->pRight
2a690 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pB->pRight, iT
2a6a0 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
2a6b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2a6c0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
2a6d0 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e  A->x.pList, pB->
2a6e0 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29  x.pList, iTab) )
2a6f0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
2a700 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69  f( ALWAYS((combi
2a710 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65  nedFlags & EP_Re
2a720 64 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41  duced)==0) && pA
2a730 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op!=TK_STRING 
2a740 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  ){.      if( pA-
2a750 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
2a760 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32  olumn ) return 2
2a770 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  ;.      if( pA->
2a780 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
2a790 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70  le .       && (p
2a7a0 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  A->iTable!=iTab 
2a7b0 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61  || NEVER(pB->iTa
2a7c0 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72  ble>=0)) ) retur
2a7d0 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 2;.    }.  }. 
2a7e0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2a7f0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
2a800 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
2a810 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
2a820 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
2a830 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65  l and .** non-ze
2a840 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65  ro if they diffe
2a850 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  r in any way..**
2a860 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
2a870 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
2a880 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
2a890 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
2a8a0 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
2a8b0 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
2a8c0 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
2a8d0 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
2a8e0 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
2a8f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2a900 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ne might return 
2a910 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75  non-zero for equ
2a920 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74  ivalent ExprList
2a930 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20  s.  The.** only 
2a940 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  consequence will
2a950 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74   be disabled opt
2a960 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74  imizations.  But
2a970 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
2a980 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75   must never retu
2a990 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20  rn 0 if the two 
2a9a0 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
2a9b0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20   are different, 
2a9c0 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74  or.** a malfunct
2a9d0 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e  ion will result.
2a9e0 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
2a9f0 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e  pointers are con
2aa00 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68  sidered to be th
2aa10 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e  e same.  But a N
2aa20 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61  ULL pointer.** a
2aa30 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72  lways differs fr
2aa40 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f  om a non-NULL po
2aa50 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
2aa60 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
2aa70 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70  pare(ExprList *p
2aa80 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c  A, ExprList *pB,
2aa90 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e   int iTab){.  in
2aaa0 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
2aab0 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75   && pB==0 ) retu
2aac0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d  rn 0;.  if( pA==
2aad0 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74  0 || pB==0 ) ret
2aae0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d  urn 1;.  if( pA-
2aaf0 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70  >nExpr!=pB->nExp
2ab00 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
2ab10 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e  for(i=0; i<pA->n
2ab20 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2ab30 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70  Expr *pExprA = p
2ab40 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  A->a[i].pExpr;. 
2ab50 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20     Expr *pExprB 
2ab60 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pB->a[i].pExpr
2ab70 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b  ;.    if( pA->a[
2ab80 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42  i].sortOrder!=pB
2ab90 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2aba0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2abb0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2abc0 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72  Compare(0, pExpr
2abd0 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
2abe0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
2abf0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2ac00 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74  /*.** Like sqlit
2ac10 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29 20  e3ExprCompare() 
2ac20 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20 6f  except COLLATE o
2ac30 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20  perators at the 
2ac40 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72 65  top-level.** are
2ac50 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74   ignored..*/.int
2ac60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2ac70 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70 41  areSkip(Expr *pA
2ac80 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
2ac90 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20  iTab){.  return 
2aca0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2acb0 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20 20 20  re(0,.          
2acc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b     sqlite3ExprSk
2acd0 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a 20  ipCollate(pA),. 
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2acf0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2ad00 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20 20  te(pB),.        
2ad10 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f       iTab);.}../
2ad20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2ad30 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65   if we can prove
2ad40 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c   the pE2 will al
2ad50 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20  ways be true if 
2ad60 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20  pE1 is.** true. 
2ad70 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
2ad80 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c   we cannot compl
2ad90 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72  ete the proof or
2ada0 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a   if pE2 might.**
2adb0 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d   be false.  Exam
2adc0 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
2add0 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE1: x==5       
2ade0 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
2adf0 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72        Result: tr
2ae00 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
2ae10 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78  >0        pE2: x
2ae20 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
2ae30 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Result: false.**
2ae40 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20       pE1: x=21  
2ae50 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f       pE2: x=21 O
2ae60 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c  R y=43     Resul
2ae70 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
2ae80 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70  E1: x!=123     p
2ae90 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
2aea0 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
2aeb0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
2aec0 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20  =?1      pE2: x 
2aed0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2aee0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2aef0 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c     pE1: x IS NUL
2af00 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54  L  pE2: x IS NOT
2af10 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
2af20 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
2af30 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45  1: x IS ?2    pE
2af40 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2af50 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73      Reuslt: fals
2af60 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d  e.**.** When com
2af70 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e  paring TK_COLUMN
2af80 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70   nodes between p
2af90 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70  E1 and pE2, if p
2afa0 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69  E2 has.** Expr.i
2afb0 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73  Table<0 then ass
2afc0 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62  ume a table numb
2afd0 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62  er given by iTab
2afe0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73  ..**.** If pPars
2aff0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
2b000 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f  hen the values o
2b010 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65  f bound variable
2b020 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a  s in pE1 are .**
2b030 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73   compared agains
2b040 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73  t literal values
2b050 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50 61 72   in pE2 and pPar
2b060 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61  se->pVdbe->expma
2b070 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65  sk is.** modifie
2b080 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69 63  d to record whic
2b090 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65  h bound variable
2b0a0 73 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64  s are referenced
2b0b0 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a 2a 2a  .  If pParse .**
2b0c0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66   is NULL, then f
2b0d0 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72 65 74  alse will be ret
2b0e0 75 72 6e 65 64 20 69 66 20 70 45 31 20 63 6f 6e  urned if pE1 con
2b0f0 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20  tains any bound 
2b100 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
2b110 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   When in doubt, 
2b120 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52  return false.  R
2b130 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69  eturning true mi
2b140 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
2b150 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76  rmance.** improv
2b160 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  ement.  Returnin
2b170 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61  g false might ca
2b180 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  use a performanc
2b190 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74  e reduction, but
2b1a0 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61  .** it will alwa
2b1b0 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72  ys give the corr
2b1c0 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69  ect answer and i
2b1d0 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73  s hence always s
2b1e0 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  afe..*/.int sqli
2b1f0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
2b200 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pr(Parse *pParse
2b210 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70  , Expr *pE1, Exp
2b220 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62  r *pE2, int iTab
2b230 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2b240 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2b250 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20 69 54  se, pE1, pE2, iT
2b260 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ab)==0 ){.    re
2b270 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2b280 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  ( pE2->op==TK_OR
2b290 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45  .   && (sqlite3E
2b2a0 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
2b2b0 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2b2c0 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20  >pLeft, iTab).  
2b2d0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2b2e0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2b2f0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31  Expr(pParse, pE1
2b300 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69  , pE2->pRight, i
2b310 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20  Tab) ).  ){.    
2b320 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2b330 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
2b340 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  NOTNULL && pE1->
2b350 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26  op!=TK_ISNULL &&
2b360 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20   pE1->op!=TK_IS 
2b370 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20  ){.    Expr *pX 
2b380 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2b390 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e 70 4c  pCollate(pE1->pL
2b3a0 65 66 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  eft);.    testca
2b3b0 73 65 28 20 70 58 21 3d 70 45 31 2d 3e 70 4c 65  se( pX!=pE1->pLe
2b3c0 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ft );.    if( sq
2b3d0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2b3e0 28 70 50 61 72 73 65 2c 20 70 58 2c 20 70 45 32  (pParse, pX, pE2
2b3f0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d  ->pLeft, iTab)==
2b400 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
2b410 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2b420 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2b430 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2b440 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2b450 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
2b460 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64  e walker.** to d
2b470 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65  etermine if an e
2b480 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
2b490 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65   evaluated by re
2b4a0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a  ference to the.*
2b4b0 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69  * index only, wi
2b4c0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
2b4d0 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  do a search for 
2b4e0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2b4f0 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79  g.** table entry
2b500 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e  .  The IdxCover.
2b510 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68  pIdx field is th
2b520 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76  e index.  IdxCov
2b530 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68  er.iCur.** is th
2b540 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  e cursor for the
2b550 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
2b560 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49  t IdxCover {.  I
2b570 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
2b580 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
2b590 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f  be tested for co
2b5a0 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  verage */.  int 
2b5b0 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  iCur;        /* 
2b5c0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
2b5d0 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72  r the table corr
2b5e0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
2b5f0 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   index */.};../*
2b600 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
2b610 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65   if there are re
2b620 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2b630 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a  mns in table .**
2b640 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
2b650 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20  Cover->iCur can 
2b660 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69  be satisfied usi
2b670 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  ng the index.** 
2b680 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2b690 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73  over->pIdx..*/.s
2b6a0 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64  tatic int exprId
2b6b0 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70  xCover(Walker *p
2b6c0 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2b6d0 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
2b6e0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2b6f0 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54  .   && pExpr->iT
2b700 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
2b710 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
2b720 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f  .   && sqlite3Co
2b730 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c  lumnOfIndex(pWal
2b740 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2b750 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69  ->pIdx, pExpr->i
2b760 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20  Column)<0.  ){. 
2b770 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2b780 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  e = 1;.    retur
2b790 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
2b7a0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2b7b0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
2b7c0 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
2b7d0 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74   index pIdx on t
2b7e0 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
2b7f0 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77   iCur contains w
2b800 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  ill.** the expre
2b810 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
2b820 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
2b830 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65   index does cove
2b840 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  r the.** express
2b850 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ion and false if
2b860 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
2b870 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73  ssion references
2b880 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a   table columns.*
2b890 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66  * that are not f
2b8a0 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65  ound in the inde
2b8b0 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e  x pIdx..**.** An
2b8c0 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20   index covering 
2b8d0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65  an expression me
2b8e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70  ans that the exp
2b8f0 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a  ression can be.*
2b900 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e  * evaluated usin
2b910 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78  g only the index
2b920 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76   and without hav
2b930 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  ing to lookup th
2b940 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
2b950 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a  ng table entry..
2b960 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2b970 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78  prCoveredByIndex
2b980 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  (.  Expr *pExpr,
2b990 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
2b9a0 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65  ndex to be teste
2b9b0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
2b9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2b9d0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
2b9e0 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
2b9f0 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  nding table */. 
2ba00 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
2ba10 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2ba20 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  x that might be 
2ba30 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  used for coverag
2ba40 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  e */.){.  Walker
2ba50 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78   w;.  struct Idx
2ba60 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65  Cover xcov;.  me
2ba70 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
2ba80 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69  of(w));.  xcov.i
2ba90 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63  Cur = iCur;.  xc
2baa0 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  ov.pIdx = pIdx;.
2bab0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2bac0 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72  k = exprIdxCover
2bad0 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65  ;.  w.u.pIdxCove
2bae0 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c  r = &xcov;.  sql
2baf0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
2bb00 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72   pExpr);.  retur
2bb10 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a  n !w.eCode;.}...
2bb20 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
2bb30 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2bb40 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
2bb50 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
2bb60 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f   walker.** to co
2bb70 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  unt references t
2bb80 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  o table columns 
2bb90 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  in the arguments
2bba0 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65   of an .** aggre
2bbb0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69  gate function, i
2bbc0 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65  n order to imple
2bbd0 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ment the.** sqli
2bbe0 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53  te3FunctionThisS
2bbf0 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  rc() routine..*/
2bc00 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74  .struct SrcCount
2bc10 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53   {.  SrcList *pS
2bc20 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72  rc;   /* One par
2bc30 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61  ticular FROM cla
2bc40 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20  use in a nested 
2bc50 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  query */.  int n
2bc60 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  This;       /* N
2bc70 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2bc80 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
2bc90 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  n pSrcList */.  
2bca0 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20  int nOther;     
2bcb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2bcc0 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2bcd0 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f  mns in other FRO
2bce0 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a  M clauses */.};.
2bcf0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
2bd00 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
2bd10 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2bd20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bd30 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c  exprSrcCount(Wal
2bd40 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2bd50 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a  pr *pExpr){.  /*
2bd60 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20   The NEVER() on 
2bd70 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20  the second term 
2bd80 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74  is because sqlit
2bd90 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
2bda0 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20  isSrc().  ** is 
2bdb0 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65  always called be
2bdc0 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72  fore sqlite3Expr
2bdd0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2bde0 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20  s() and so the. 
2bdf0 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68   ** TK_COLUMNs h
2be00 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
2be10 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
2be20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20  TK_AGG_COLUMN.  
2be30 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  If.  ** sqlite3F
2be40 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2be50 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66  rc() is used dif
2be60 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  ferently in the 
2be70 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a  future, the.  **
2be80 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65   NEVER() will ne
2be90 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64  ed to be removed
2bea0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  . */.  if( pExpr
2beb0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2bec0 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e  || NEVER(pExpr->
2bed0 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2bee0 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  N) ){.    int i;
2bef0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43  .    struct SrcC
2bf00 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65  ount *p = pWalke
2bf10 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a  r->u.pSrcCount;.
2bf20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
2bf30 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
2bf40 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63   int nSrc = pSrc
2bf50 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20   ? pSrc->nSrc : 
2bf60 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
2bf70 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSrc; i++){.  
2bf80 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2bf90 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69  Table==pSrc->a[i
2bfa0 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ].iCursor ) brea
2bfb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
2bfc0 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20   i<nSrc ){.     
2bfd0 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20   p->nThis++;.   
2bfe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
2bff0 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d  >nOther++;.    }
2c000 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2c010 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2c020 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
2c030 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67  f any of the arg
2c040 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45  uments to the pE
2c050 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66  xpr Function ref
2c060 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69  erence.** pSrcLi
2c070 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  st.  Return true
2c080 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c   if they do.  Al
2c090 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
2c0a0 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  f the function.*
2c0b0 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e  * has no argumen
2c0c0 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63  ts or has only c
2c0d0 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
2c0e0 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  s.  Return false
2c0f0 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66   if pExpr.** ref
2c100 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20  erences columns 
2c110 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20  but not columns 
2c120 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20  of tables found 
2c130 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  in pSrcList..*/.
2c140 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74  int sqlite3Funct
2c150 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45  ionUsesThisSrc(E
2c160 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c  xpr *pExpr, SrcL
2c170 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a  ist *pSrcList){.
2c180 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
2c190 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e  ruct SrcCount cn
2c1a0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  t;.  assert( pEx
2c1b0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
2c1c0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78  UNCTION );.  w.x
2c1d0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
2c1e0 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77  xprSrcCount;.  w
2c1f0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2c200 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63   = 0;.  w.u.pSrc
2c210 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20  Count = &cnt;.  
2c220 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c  cnt.pSrc = pSrcL
2c230 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73  ist;.  cnt.nThis
2c240 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68   = 0;.  cnt.nOth
2c250 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
2c260 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77  3WalkExprList(&w
2c270 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
2c280 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e  );.  return cnt.
2c290 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e  nThis>0 || cnt.n
2c2a0 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Other==0;.}../*.
2c2b0 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
2c2c0 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
2c2d0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
2c2e0 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
2c2f0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
2c300 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
2c310 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2c320 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
2c330 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2c340 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
2c350 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a  Column(sqlite3 *
2c360 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
2c370 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
2c380 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
2c390 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
2c3a0 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20  te(.       db,. 
2c3b0 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
2c3c0 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  l,.       sizeof
2c3d0 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29  (pInfo->aCol[0])
2c3e0 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
2c3f0 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
2c400 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
2c410 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
2c420 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
2c430 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
2c440 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
2c450 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
2c460 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
2c470 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
2c480 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2c490 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
2c4a0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2c4b0 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
2c4c0 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62  Func(sqlite3 *db
2c4d0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
2c4e0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
2c4f0 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c  nfo->aFunc = sql
2c500 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
2c510 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20  e(.       db, . 
2c520 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75        pInfo->aFu
2c530 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  nc,.       sizeo
2c540 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
2c550 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
2c560 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->nFunc,.      
2c570 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
2c580 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
2c590 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
2c5a0 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  xprCallback for 
2c5b0 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20  a tree walker.  
2c5c0 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  It is used to.**
2c5d0 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
2c5e0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2c5f0 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
2c600 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2c610 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
2c620 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
2c630 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
2c640 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
2c650 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65  eAggregate(Walke
2c660 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2c670 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
2c680 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
2c690 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
2c6a0 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  >u.pNC;.  Parse 
2c6b0 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
2c6c0 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
2c6d0 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
2c6e0 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
2c6f0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
2c700 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b  = pNC->pAggInfo;
2c710 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
2c720 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
2c730 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
2c740 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
2c750 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  UMN: {.      tes
2c760 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c770 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
2c780 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2c790 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2c7a0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
2c7b0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
2c7c0 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
2c7d0 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
2c7e0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2c7f0 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  OM.      ** clau
2c800 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
2c810 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  ate query */.   
2c820 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
2c830 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  rcList!=0) ){.  
2c840 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
2c850 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2c860 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
2c870 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2c880 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
2c890 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
2c8a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
2c8b0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
2c8c0 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pCol;.          
2c8d0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2c8e0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2c8f0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2c900 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2c910 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2c920 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
2c930 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
2c940 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
2c950 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
2c960 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
2c970 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20  pExpr refers to 
2c980 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  a table.        
2c990 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69      ** that is i
2c9a0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2c9b0 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
2c9c0 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20  te query.  .    
2c9d0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2c9e0 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61         ** Make a
2c9f0 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
2ca00 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e  column in pAggIn
2ca10 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68  fo->aCol[] if th
2ca20 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
2ca30 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74  ** is not an ent
2ca40 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ry there already
2ca50 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
2ca60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2ca70 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
2ca80 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d  pCol = pAggInfo-
2ca90 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  >aCol;.         
2caa0 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41     for(k=0; k<pA
2cab0 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
2cac0 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   k++, pCol++){. 
2cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2cae0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70   pCol->iTable==p
2caf0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
2cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb10 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d    pCol->iColumn=
2cb20 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
2cb30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2cb40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2cb50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cb60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cb70 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67      if( (k>=pAgg
2cb80 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20  Info->nColumn). 
2cb90 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2cba0 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  k = addAggInfoCo
2cbb0 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  lumn(pParse->db,
2cbc0 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a   pAggInfo))>=0 .
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2cbf0 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
2cc00 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  Col[k];.        
2cc10 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
2cc20 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
2cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2cc40 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ol->iTable = pEx
2cc50 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
2cc60 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2cc70 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
2cc80 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
2cc90 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d          pCol->iM
2cca0 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
2ccb0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
2ccc0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
2ccd0 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
2cce0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2ccf0 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2cd10 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  ( pAggInfo->pGro
2cd20 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
2cd30 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e          int j, n
2cd40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cd50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20    ExprList *pGB 
2cd60 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  = pAggInfo->pGro
2cd70 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20  upBy;.          
2cd80 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
2cd90 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
2cda0 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20  m = pGB->a;.    
2cdb0 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
2cdc0 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pGB->nExpr;.    
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2cde0 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70  j=0; j<n; j++, p
2cdf0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
2ce00 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
2ce10 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pE = pTerm->pEx
2ce20 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2ce30 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
2ce40 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
2ce50 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  E->iTable==pExpr
2ce60 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
2ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce80 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70    pE->iColumn==p
2ce90 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
2cea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ceb0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2cec0 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  erColumn = j;.  
2ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cee0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2cef0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2cf30 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2cf40 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
2cf50 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2cf60 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
2cf70 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69  pAggInfo->nSorti
2cf80 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20  ngColumn++;.    
2cf90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cfa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cfb0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
2cfc0 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66  s now an entry f
2cfd0 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67  or pExpr in pAgg
2cfe0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69  Info->aCol[] (ei
2cff0 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
2d000 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77   ** because it w
2d010 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20  as there before 
2d020 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  or because we ju
2d030 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a  st created it)..
2d040 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43              ** C
2d050 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72  onvert the pExpr
2d060 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f   to be a TK_AGG_
2d070 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67  COLUMN referring
2d080 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   to that.       
2d090 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f       ** pAggInfo
2d0a0 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a  ->aCol[] entry..
2d0b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2d0c0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53             ExprS
2d0d0 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
2d0e0 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
2d0f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2d100 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
2d110 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
2d120 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
2d130 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   = TK_AGG_COLUMN
2d140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
2d150 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
2d160 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  )k;.            
2d170 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2d180 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70   } /* endif pExp
2d190 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
2d1a0 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  ->iCursor */.   
2d1b0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f       } /* end lo
2d1c0 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  op over pSrcList
2d1d0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2d1e0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2d1f0 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ne;.    }.    ca
2d200 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
2d210 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ON: {.      if( 
2d220 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20  (pNC->ncFlags & 
2d230 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30  NC_InAggFunc)==0
2d240 0a 20 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b  .       && pWalk
2d250 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d  er->walkerDepth=
2d260 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20  =pExpr->op2.    
2d270 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
2d280 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2d290 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69  pExpr is a dupli
2d2a0 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  cate of another 
2d2b0 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20  aggregate .     
2d2c0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74     ** function t
2d2d0 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  hat is already i
2d2e0 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73  n the pAggInfo s
2d2f0 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20  tructure.       
2d300 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75   */.        stru
2d310 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
2d320 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66  *pItem = pAggInf
2d330 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20  o->aFunc;.      
2d340 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
2d350 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2d360 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2d370 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2d380 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
2d390 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70   pItem->pExpr, p
2d3a0 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  Expr, -1)==0 ){.
2d3b0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2d3c0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
2d3d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d3e0 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
2d3f0 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
2d400 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
2d410 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
2d420 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
2d430 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2d440 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
2d450 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
2d460 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
2d470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
2d480 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
2d490 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
2d4a0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
2d4b0 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
2d4c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2d4d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2d4e0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
2d4f0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2d500 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
2d510 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
2d520 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
2d530 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
2d540 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
2d550 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
2d560 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2d570 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2d580 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2d590 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
2d5a0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
2d5b0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
2d5c0 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
2d5d0 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
2d5e0 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
2d5f0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2d600 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20  u.zToken, .     
2d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2d620 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70  xpr->x.pList ? p
2d630 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
2d640 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30  Expr : 0, enc, 0
2d650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2d660 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
2d670 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
2d680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2d690 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
2d6a0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2d6b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
2d6c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2d6d0 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
2d6e0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
2d6f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d700 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2d710 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45        /* Make pE
2d720 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  xpr point to the
2d730 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67   appropriate pAg
2d740 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65  gInfo->aFunc[] e
2d750 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ntry.        */.
2d760 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d770 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2d780 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
2d790 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2d7a0 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   );.        Expr
2d7b0 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2d7c0 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
2d7d0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  e);.        pExp
2d7e0 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69  r->iAgg = (i16)i
2d7f0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
2d800 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
2d810 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
2d820 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2d830 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d840 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2d850 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
2d860 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2d870 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2d880 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  e;.}.static int 
2d890 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2d8a0 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72  sInSelect(Walker
2d8b0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
2d8c0 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55  t *pSelect){.  U
2d8d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2d8e0 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c  pSelect);.  pWal
2d8f0 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
2d900 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  ++;.  return WRC
2d910 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61  _Continue;.}.sta
2d920 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65  tic void analyze
2d930 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2d940 63 74 45 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57  ctEnd(Walker *pW
2d950 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
2d960 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45  Select){.  UNUSE
2d970 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c  D_PARAMETER(pSel
2d980 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  ect);.  pWalker-
2d990 3e 77 61 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a  >walkerDepth--;.
2d9a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
2d9b0 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
2d9c0 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ssion looking fo
2d9d0 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
2d9e0 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72  tions and.** for
2d9f0 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
2da00 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
2da10 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65   to AggInfo obje
2da20 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67  ct that pNC->pAg
2da30 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20  gInfo.** points 
2da40 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  to.  Additional 
2da50 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65  entries are made
2da60 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   on the AggInfo 
2da70 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63  object as.** nec
2da80 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  essary..**.** Th
2da90 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
2daa0 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
2dab0 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65   after the expre
2dac0 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a  ssion has been.*
2dad0 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71  * analyzed by sq
2dae0 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
2daf0 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Names()..*/.void
2db00 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2db10 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61  yzeAggregates(Na
2db20 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
2db30 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2db40 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45  Walker w;.  w.xE
2db50 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e  xprCallback = an
2db60 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a  alyzeAggregate;.
2db70 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2db80 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ack = analyzeAgg
2db90 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b  regatesInSelect;
2dba0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2dbb0 62 61 63 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41  back2 = analyzeA
2dbc0 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2dbd0 74 45 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72  tEnd;.  w.walker
2dbe0 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75  Depth = 0;.  w.u
2dbf0 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73  .pNC = pNC;.  as
2dc00 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c  sert( pNC->pSrcL
2dc10 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ist!=0 );.  sqli
2dc20 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
2dc30 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
2dc40 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
2dc50 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2dc60 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
2dc70 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
2dc80 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
2dc90 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
2dca0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
2dcb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2dcc0 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
2dcd0 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
2dce0 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64  t short..*/.void
2dcf0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2dd00 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43  yzeAggList(NameC
2dd10 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
2dd20 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
2dd30 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2dd40 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
2dd50 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
2dd60 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  st ){.    for(pI
2dd70 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
2dd80 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
2dd90 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
2dda0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2ddb0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2ddc0 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
2ddd0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
2dde0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
2ddf0 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65  cate a single ne
2de00 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75  w register for u
2de10 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20  se to hold some 
2de20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
2de30 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ult..*/.int sqli
2de40 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61  te3GetTempReg(Pa
2de50 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
2de60 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
2de70 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pReg==0 ){.    r
2de80 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
2de90 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nMem;.  }.  retu
2dea0 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  rn pParse->aTemp
2deb0 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54  Reg[--pParse->nT
2dec0 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  empReg];.}../*.*
2ded0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72  * Deallocate a r
2dee0 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20  egister, making 
2def0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
2df00 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
2df10 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a  er.** purpose..*
2df20 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
2df30 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
2df40 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  being used by th
2df50 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20  e column cache, 
2df60 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c  then.** the deal
2df70 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65  location is defe
2df80 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63  rred until the c
2df90 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65  olumn cache line
2dfa0 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68   that uses.** th
2dfb0 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d  e register becom
2dfc0 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69  es stale..*/.voi
2dfd0 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2dfe0 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
2dff0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
2e000 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
2e010 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2e020 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
2e030 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
2e040 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
2e050 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
2e060 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  *p;.    for(i=0,
2e070 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
2e080 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e  ache; i<pParse->
2e090 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20  nColCache; i++, 
2e0a0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
2e0b0 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
2e0c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  .        p->temp
2e0d0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Reg = 1;.       
2e0e0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
2e0f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
2e100 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
2e110 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
2e120 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
2e130 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
2e140 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
2e150 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
2e160 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
2e170 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2e180 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
2e190 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2e1a0 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
2e1b0 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d   n;.  if( nReg==
2e1c0 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74  1 ) return sqlit
2e1d0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2e1e0 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50 61 72  rse);.  i = pPar
2e1f0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20  se->iRangeReg;. 
2e200 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61   n = pParse->nRa
2e210 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52  ngeReg;.  if( nR
2e220 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73  eg<=n ){.    ass
2e230 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75  ert( !usedAsColu
2e240 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
2e250 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20  i, i+n-1) );.   
2e260 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2e270 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  eg += nReg;.    
2e280 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2e290 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c  g -= nReg;.  }el
2e2a0 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72  se{.    i = pPar
2e2b0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
2e2c0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
2e2d0 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nReg;.  }.  retu
2e2e0 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  rn i;.}.void sql
2e2f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2e300 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2e310 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
2e320 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e  t nReg){.  if( n
2e330 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71  Reg==1 ){.    sq
2e340 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2e350 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 67  Reg(pParse, iReg
2e360 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2e370 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
2e380 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
2e390 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b  se, iReg, nReg);
2e3a0 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72  .  if( nReg>pPar
2e3b0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b  se->nRangeReg ){
2e3c0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
2e3d0 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20  ngeReg = nReg;. 
2e3e0 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
2e3f0 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d  eReg = iReg;.  }
2e400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
2e410 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  ll temporary reg
2e420 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20  isters as being 
2e430 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  unavailable for 
2e440 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reuse..*/.void s
2e450 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2e460 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  egCache(Parse *p
2e470 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
2e480 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a  ->nTempReg = 0;.
2e490 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
2e4a0 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Reg = 0;.}../*.*
2e4b0 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61 74 20  * Validate that 
2e4c0 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  no temporary reg
2e4d0 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68  ister falls with
2e4e0 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a  in the range of.
2e4f0 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74  ** iFirst..iLast
2e500 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68  , inclusive.  Th
2e510 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
2e520 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74  ly call from wit
2e530 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20  hin assert().** 
2e540 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23  statements..*/.#
2e550 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2e560 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f  UG.int sqlite3No
2e570 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72  TempsInRange(Par
2e580 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2e590 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73  iFirst, int iLas
2e5a0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
2e5b0 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  f( pParse->nRang
2e5c0 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61  eReg>0.   && pPa
2e5d0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70  rse->iRangeReg+p
2e5e0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2e5f0 20 3e 20 69 46 69 72 73 74 0a 20 20 20 26 26 20   > iFirst.   && 
2e600 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2e610 67 20 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a  g <= iLast.  ){.
2e620 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2e630 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
2e640 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2e650 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2e660 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2e670 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70  [i]>=iFirst && p
2e680 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2e690 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20  i]<=iLast ){.   
2e6a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2e6b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2e6c0 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
2e6d0 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a     QLITE_DEBUG */.