/ Hex Artifact Content
Login

Artifact 825198653fb655df3d758c556eb003f0a531a3661d0573cf445b4e9298daac07:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
0fd0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
0fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
0ff0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1000: 29 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  ) works the same
1010: 20 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72   exact that it r
1020: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65  eturns the.** de
1030: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1040: 69 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20  if pExpr has no 
1050: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
1060: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  n..**.** The col
1070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1080: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
1090: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
10a0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
10b0: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
10c0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
10d0: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
10f0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
1100: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
1110: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
1120: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
1130: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
1140: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
1150: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1160: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1180: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1190: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
11b0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
11c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
11d0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
11e0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
11f0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >op;.    if( p->
1200: 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72  flags & EP_Gener
1210: 69 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ic ) break;.    
1220: 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f  if( (op==TK_AGG_
1230: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
1240: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
1250: 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    || op==TK_REGI
1260: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54  STER || op==TK_T
1270: 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26 20  RIGGER).     && 
1280: 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 29  p->pTab!=0.    )
1290: 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54  {.      /* op==T
12a0: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
12b0: 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73  >pTab!=0 happens
12c0: 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20   when pExpr was 
12d0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20  originally.     
12e0: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
12f0: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
1300: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
1310: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
1320: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  ister */.      i
1330: 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  nt j = p->iColum
1340: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  n;.      if( j>=
1350: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
1360: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
1370: 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a   p->pTab->aCol[j
1380: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
1390: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
13a0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
13b0: 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
13c0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13e0: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
13f0: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1400: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1410: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1420: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1430: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1440: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1450: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1460: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
1470: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
1480: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
1490: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
14a0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
14b0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
14c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14d0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
14e0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
14f0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
1500: 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67   (p->pLeft->flag
1510: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
1520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20  =0 ){.        p 
1530: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1550: 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20 3d 20   Expr *pNext  = 
1560: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1570: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
1580: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
1590: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
15a0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
15b0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
15c0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
15d0: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
15e0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
15f0: 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68 6f 6c   /* p->flags hol
1600: 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20 61 6e  ds EP_Collate an
1610: 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  d p->pLeft->flag
1620: 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41 6e 64  s does not.  And
1630: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 78  .        ** p->x
1640: 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f 74 2e  .pSelect cannot.
1650: 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70 4c 65    So if p->x.pLe
1660: 66 74 20 65 78 69 73 74 73 2c 20 69 74 20 6d 75  ft exists, it mu
1670: 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20 20 20  st hold at.     
1680: 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20     ** least one 
1690: 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68 75 73  EP_Collate. Thus
16a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
16b0: 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a 20 20  wo ALWAYS. */.  
16c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 2e 70        if( p->x.p
16d0: 4c 69 73 74 21 3d 30 20 26 26 20 41 4c 57 41 59  List!=0 && ALWAY
16e0: 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  S(!ExprHasProper
16f0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
1700: 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ct)) ){.        
1710: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
1730: 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  YS(i<p->x.pList-
1740: 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20  >nExpr); i++){. 
1750: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45             if( E
1760: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1770: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1780: 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74  pExpr, EP_Collat
1790: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
17a0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78      pNext = p->x
17b0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
17c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1800: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
1810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1820: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
1830: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1840: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
1850: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
1860: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
1870: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1880: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
1890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
18a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18b0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
18c0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
18d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
18e0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
18f0: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
1900: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1910: 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c 6c  .** defautl coll
1920: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
1930: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1950: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
1960: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1970: 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  q() routine work
1980: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
1990: 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65 74  t that it.** ret
19a0: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19b0: 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64  re is no defined
19c0: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 43   collation..*/.C
19d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
19e0: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61 72  xprNNCollSeq(Par
19f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a00: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
1a10: 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Seq *p = sqlite3
1a20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1a30: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  se, pExpr);.  if
1a40: 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50 61  ( p==0 ) p = pPa
1a50: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1a60: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  ll;.  assert( p!
1a70: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a90: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74 77  n TRUE if the tw
1aa0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68 61  o expressions ha
1ab0: 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  ve equivalent co
1ac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ad0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1ae0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63  3ExprCollSeqMatc
1af0: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1b00: 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
1b10: 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53 65   *pE2){.  CollSe
1b20: 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c 69  q *pColl1 = sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a 20  (pParse, pE1);. 
1b50: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
1b60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
1b70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b80: 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  pE2);.  return s
1b90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ba0: 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f  oll1->zName, pCo
1bb0: 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b 0a  ll2->zName)==0;.
1bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1bd0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
1be0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1bf0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1c00: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1c10: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1c20: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1c30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c40: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1c50: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1c60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1c70: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1c80: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
1c90: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1ca0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
1cb0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
1cc0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
1cd0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1ce0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1cf0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1d00: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1d10: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1d20: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1d30: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1d40: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1d50: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1d60: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1d70: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1d80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d90: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1da0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
1db0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1dc0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
1dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1de0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1e00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1e10: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1e20: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1e30: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1e40: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1e50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e60: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1e70: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1e80: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1eb0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ec0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ed0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1ee0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1ef0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1f00: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1f10: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1f20: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1f30: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1f40: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1f50: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1f60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1f70: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1f80: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1f90: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1fa0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1fb0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1fc0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1fd0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1fe0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1ff0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2000: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2010: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2020: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2030: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2040: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2050: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2060: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2070: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
2080: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
2090: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
20a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
20b0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
20c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
20d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
20e0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
20f0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2100: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2110: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2120: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2130: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2140: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2150: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2160: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2170: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
2180: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
2190: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
21b0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
21c0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
21f0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2200: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2210: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2220: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2230: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2240: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2250: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2260: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2270: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
2280: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
2290: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
22a0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
22b0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
22c0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
22d0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
22e0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
22f0: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2300: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2310: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2320: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2330: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2340: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2350: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2360: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2370: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
2380: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
2390: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
23a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23b0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
23c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
23d0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
23e0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
23f0: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2400: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2410: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2420: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2430: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2440: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2460: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2470: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2480: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
2490: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
24a0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
24b0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
24c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
24d0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
24e0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
24f0: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2500: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2510: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2520: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2530: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2540: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2550: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2560: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2570: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2580: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
2590: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
25a0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
25b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25c0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
25d0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
25e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
25f0: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2600: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2610: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2620: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2630: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2640: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2650: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2660: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2670: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2680: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
2690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
26a0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
26b0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
26c0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
26d0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
26e0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
26f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2700: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2710: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2720: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2730: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2740: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2750: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2760: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2770: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2780: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
2790: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
27a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27b0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
27c0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
27d0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
27e0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
27f0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2800: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2810: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2820: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2830: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2840: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2850: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2860: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2870: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2880: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
2890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
28b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
28c0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
28d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
28e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
28f0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2900: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2910: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2920: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2940: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2950: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2960: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2970: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2980: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
2990: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
29a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
29b0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
29c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
29d0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
29e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
29f0: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2a00: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2a10: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2a20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2a30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2a40: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2a50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2a70: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2a80: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
2a90: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
2aa0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
2ab0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
2ac0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
2ad0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
2ae0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2af0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2b00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2b10: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2b20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2b30: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2b40: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2b50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2b60: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2b70: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2b80: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
2b90: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
2ba0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2bb0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
2bc0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
2bd0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2c00: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2c10: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2c20: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2c30: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2c40: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2c60: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2c70: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2c80: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
2c90: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
2ca0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
2cb0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
2cc0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
2cd0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
2ce0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2cf0: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2d00: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2d10: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2d20: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2d30: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2d40: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2d50: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2d60: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2d70: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2d80: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
2d90: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
2da0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
2db0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
2dc0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
2dd0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
2de0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2e00: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2e20: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2e30: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2e60: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2e70: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2e80: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2e90: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ea0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2eb0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ec0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ed0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2ee0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2ef0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2f00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2f10: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2f20: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2f30: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2f40: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2f50: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2f60: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2f70: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2f80: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2fb0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2fc0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2fd0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2fe0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2ff0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
3000: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
3010: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
3020: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
3030: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
3040: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
3050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3060: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
3070: 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70  bexpression of p
3080: 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74  Vector that is t
3090: 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d  he i-th.** colum
30a0: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
30b0: 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69  (numbered starti
30c0: 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65  ng with 0).  The
30d0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
30e0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73  ensure that i is
30f0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a   within range..*
3100: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3110: 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c  is really a scal
3120: 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22  ar (and "scalar"
3130: 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73   here includes s
3140: 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61  ubqueries.** tha
3150: 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  t return a singl
3160: 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20  e column!) then 
3170: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75  return pVector u
3180: 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  nmodified..**.**
3190: 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73   pVector retains
31a0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
31b0: 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65 78  e returned subex
31c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
31d0: 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69 73  If the vector is
31e0: 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20   a (SELECT ...) 
31f0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
3200: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a  ion returned is.
3210: 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70 72  ** just the expr
3220: 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  ession for the i
3230: 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
3240: 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
3250: 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65  may.** not be re
3260: 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ady for evaluati
3270: 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74  on because the t
3280: 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20  able cursor has 
3290: 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
32a0: 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45  positioned..*/.E
32b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74  xpr *sqlite3Vect
32c0: 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45  orFieldSubexpr(E
32d0: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e  xpr *pVector, in
32e0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
32f0: 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  i<sqlite3ExprVec
3300: 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29  torSize(pVector)
3310: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
3320: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56  3ExprIsVector(pV
3330: 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73  ector) ){.    as
3340: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f  sert( pVector->o
3350: 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72  p2==0 || pVector
3360: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
3370: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65  R );.    if( pVe
3380: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3390: 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e  ECT || pVector->
33a0: 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  op2==TK_SELECT )
33b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
33c0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
33d0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
33e0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
33f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3400: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3410: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3430: 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  pVector;.}../*.*
3440: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
3450: 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20  turn a new Expr 
3460: 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65  object which whe
3470: 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73  n passed to.** s
3480: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
3490: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61   will generate a
34a0: 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64  ll necessary cod
34b0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  e to compute.** 
34c0: 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f  the iField-th co
34d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
34e0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56  or expression pV
34f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ector..**.** It 
3500: 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f  is ok for pVecto
3510: 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  r to be a scalar
3520: 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69   (as long as iFi
3530: 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e  eld==0).  .** In
3540: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
3550: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
3560: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44  ike sqlite3ExprD
3570: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  up()..**.** The 
3580: 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20  caller owns the 
3590: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
35a0: 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70  ject and is resp
35b0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65  onsible for.** e
35c0: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
35d0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
35e0: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
35f0: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  freed..**.** The
3600: 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20   caller retains 
3610: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65  ownership of pVe
3620: 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f  ctor.  If pVecto
3630: 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54  r is a TK_SELECT
3640: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
3650: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77 69  turned object wi
3660: 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65  ll reference pVe
3670: 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63  ctor and so pVec
3680: 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a  tor must remain.
3690: 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ** valid for the
36a0: 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74   life of the ret
36b0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49  urned object.  I
36c0: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
36d0: 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61  K_VECTOR.** or a
36e0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
36f0: 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20  on, then it can 
3700: 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
3710: 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  on as this routi
3720: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a  ne.** returns..*
3730: 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20  *.** A trick to 
3740: 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43  cause a TK_SELEC
3750: 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20  T pVector to be 
3760: 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72  deleted together
3770: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74   with.** the ret
3780: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3790: 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74  t is to attach t
37a0: 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68  he pVector to th
37b0: 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a  e pRight field.*
37c0: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
37d0: 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  d TK_SELECT_COLU
37e0: 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a  MN Expr object..
37f0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3800: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
3810: 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ld(.  Parse *pPa
3820: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3830: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3840: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3850: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
3860: 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20  ector.  List of 
3870: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61  expressions or a
3880: 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20   sub-SELECT */. 
3890: 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20   int iField     
38a0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
38b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
38c0: 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  tor to return */
38d0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74  .){.  Expr *pRet
38e0: 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d  ;.  if( pVector-
38f0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
3910: 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45  ector->flags & E
3920: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20  P_xIsSelect );. 
3930: 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c     /* The TK_SEL
3940: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3950: 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  node:.    **.   
3960: 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20   ** pLeft:      
3970: 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e       pVector con
3980: 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43  taining TK_SELEC
3990: 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e  T.  Not deleted.
39a0: 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20  .    ** pRight: 
39b0: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65           not use
39c0: 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76  d.  But recursiv
39d0: 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  ely deleted..   
39e0: 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20   ** iColumn:    
39f0: 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20       Index of a 
3a00: 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f  column in pVecto
3a10: 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a  r.    ** iTable:
3a20: 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20 74            0 or t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
3a40: 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53 20  umns on the LHS 
3a50: 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74  of an assignment
3a60: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3a70: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3a80: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3a90: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3aa0: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3ab0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3ac0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
3ad0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
3ae0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
3af0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
3b00: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
3b10: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3b20: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3b30: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3b40: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3b50: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3b60: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3b70: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3b80: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3b90: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3ba0: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3bb0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
3bc0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
3bd0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
3be0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
3bf0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
3c00: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3c10: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3c20: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3c30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3c40: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3c50: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3c60: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3c70: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3c80: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3c90: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3ca0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3cb0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
3cc0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Ret ){.      pRe
3cd0: 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69  t->iColumn = iFi
3ce0: 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  eld;.      pRet-
3cf0: 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72  >pLeft = pVector
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3d10: 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70  rt( pRet==0 || p
3d20: 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  Ret->iTable==0 )
3d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
3d50: 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63  TK_VECTOR ) pVec
3d60: 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  tor = pVector->x
3d70: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
3d80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65  ].pExpr;.    pRe
3d90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3da0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
3db0: 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a  Vector, 0);.  }.
3dc0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
3de0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f  ssion pExpr is o
3df0: 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54  f type TK_SELECT
3e00: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
3e10: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69  to evaluate.** i
3e20: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  t. Return the re
3e30: 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20  gister in which 
3e40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
3e50: 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65  ored (or, if the
3e60: 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
3e70: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3e80: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  n one column, th
3e90: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3ea0: 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74  ray.** of regist
3eb0: 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65  ers in which the
3ec0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3ed0: 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  d)..**.** If pEx
3ee0: 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53  pr is not a TK_S
3ef0: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3f00: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
3f10: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
3f20: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
3f30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3f40: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
3f50: 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  eg = 0;.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3f70: 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
3f80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3f90: 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c  ){.    reg = sql
3fa0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
3fb0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
3fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
3fd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
3fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
3ff0: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
4000: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
4010: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4020: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4030: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4040: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4050: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4060: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4070: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4080: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
4090: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
40a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
40b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
40c0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
40d0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
40e0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
40f0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
4100: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
4110: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4120: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4130: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4140: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4150: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4160: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4170: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4180: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
4190: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
41a0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
41b0: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
41c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
41d0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
41e0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
41f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
4200: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
4210: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4220: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4230: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4240: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4250: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4260: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4270: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4280: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
4290: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
42a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
42b0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
42c0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
42d0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
42e0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
42f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4300: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
4310: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4320: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4330: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4340: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4350: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
4390: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
43a0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
43b0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
43c0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
43d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
43e0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
4410: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4420: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4450: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4460: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4470: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4480: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
4490: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
44a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
44b0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
44c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
44d0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
44e0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
44f0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
4500: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4510: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4520: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4530: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4540: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4550: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4560: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4570: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4580: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
45a0: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
45b0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
45c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
45d0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
45e0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
45f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
4600: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
4610: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4620: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4630: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4640: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4650: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4660: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4670: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4680: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
4690: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
46a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
46b0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
46c0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
46d0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
46e0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
46f0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4700: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
4710: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4720: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4730: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4740: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4750: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4770: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4780: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
4790: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
47a0: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
47b0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
47c0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
47d0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
47e0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
47f0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
4800: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4820: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4830: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4840: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4850: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4860: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4870: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4880: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4890: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
48a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
48b0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
48c0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
48d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
48e0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
48f0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4900: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
4910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4920: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4930: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4950: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4960: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4970: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4980: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4990: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
49a0: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
49b0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
49c0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
49d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
49e0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
49f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4a00: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4a10: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4a20: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4a30: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4a50: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  abel(v);..  if( 
4a60: 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45 78  nLeft!=sqlite3Ex
4a70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69  prVectorSize(pRi
4a80: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
4a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4aa0: 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
4ab0: 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72 65  isused");.    re
4ac0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ad0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4ae0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
4af0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
4b20: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20  p==TK_ISNOT .   
4b30: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72  ==TK_LT || pExpr
4b50: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20  ->op==TK_GT .   
4b60: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b70: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72  ==TK_LE || pExpr
4b80: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29  ->op==TK_GE .  )
4b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
4ba0: 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45  r->op==op || (pE
4bb0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26  xpr->op==TK_IS &
4bc0: 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20  & op==TK_EQ).   
4bd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78           || (pEx
4be0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4bf0: 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29   && op==TK_NE) )
4c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c10: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d  0 || pExpr->op!=
4c20: 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  op );.  assert( 
4c30: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4c40: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
4c50: 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53  op );..  p5 |= S
4c60: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20  QLITE_STOREP2;. 
4c70: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20   if( opx==TK_LE 
4c80: 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20  ) opx = TK_LT;. 
4c90: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20   if( opx==TK_GE 
4ca0: 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a  ) opx = TK_GT;..
4cb0: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4cc0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4cd0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4ce0: 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43  regRight = exprC
4cf0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
4d00: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20  rse, pRight);.. 
4d10: 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f   for(i=0; 1 /*Lo
4d20: 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65  op exits by "bre
4d30: 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20  ak"*/; i++){.   
4d40: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
4d50: 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  0, regFree2 = 0;
4d60: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a  .    Expr *pL, *
4d70: 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c  pR; .    int r1,
4d80: 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28   r2;.    assert(
4d90: 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74   i>=0 && i<nLeft
4da0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20   );.    if( i>0 
4db0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  ) sqlite3ExprCac
4dc0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
4dd0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4de0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4df0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4e00: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e10: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e20: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e30: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e40: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e50: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e60: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e70: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e80: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e90: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4ea0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4eb0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4ec0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ed0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ee0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ef0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f00: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f10: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f20: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f30: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f40: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f50: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f60: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f70: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f80: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f90: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4fa0: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fb0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fc0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fd0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fe0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4ff0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5000: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5010: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5020: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5030: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5040: 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70  i>0 ) sqlite3Exp
5050: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
5060: 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c  );.    if( i==nL
5070: 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62  eft-1 ){.      b
5080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5090: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29  if( opx==TK_EQ )
50a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
50b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
50c0: 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64  IfNot, dest, add
50d0: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
50e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
50f0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
5100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
5110: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29  if( opx==TK_NE )
5120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5140: 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f  If, dest, addrDo
5150: 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ne); VdbeCoverag
5160: 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c  e(v);.      p5 |
5170: 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  = SQLITE_KEEPNUL
5180: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
5190: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
51a0: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  TK_LT || op==TK_
51b0: 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20  GT || op==TK_LE 
51c0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  || op==TK_GE );.
51d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c  eAddOp2(v, OP_El
51f0: 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72  seNotEq, 0, addr
5200: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Done);.      Vdb
5210: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
5220: 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20  p==TK_LT);.     
5230: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
5240: 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20  v, op==TK_GT);. 
5250: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5260: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45  eIf(v, op==TK_LE
5270: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5280: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
5290: 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28  K_GE);.      if(
52a0: 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70   i==nLeft-2 ) op
52b0: 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  x = op;.    }.  
52c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
52d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
52e0: 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66  ddrDone);.}..#if
52f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
5300: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
5310: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
5320: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
5330: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
5340: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
5350: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
5360: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
5370: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
5380: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5390: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
53a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
53b0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
53c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
53d0: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
53e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
53f0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
5400: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
5410: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5420: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
5430: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
5440: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
5450: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5460: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
5470: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
5480: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
5490: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
54a0: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
54b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
54c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
54d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
54e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
54f0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
5500: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
5510: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
5520: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
5530: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
5540: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
5550: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
5560: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
5570: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5580: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
5590: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
55a0: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
55b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
55c0: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
55d0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
55e0: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
55f0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
5600: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
5610: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
5620: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
5630: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
5640: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
5650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5660: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
5670: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5680: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5690: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
56a0: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
56b0: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
56c0: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
56d0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
56e0: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
56f0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
5700: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5710: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5720: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5730: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
5740: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
5750: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
5760: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
5770: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
5780: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5790: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
57a0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20  t *pSelect, int 
57b0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65  *pnHeight){.  Se
57c0: 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70  lect *p;.  for(p
57d0: 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70  =pSelect; p; p=p
57e0: 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68  ->pPrior){.    h
57f0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5800: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
5810: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5820: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
5830: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5840: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5850: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
5860: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5870: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
5880: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5890: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
58a0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
58b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
58c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
58d0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
58e0: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
58f0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
5900: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
5910: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
5920: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
5930: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
5940: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
5950: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
5960: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
5970: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
5980: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
5990: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
59a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
59b0: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
59c0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
59d0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
59e0: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
59f0: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
5a00: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
5a10: 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67  pagate EP_Propag
5a20: 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f  ate flags up fro
5a30: 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74  m Expr.x.pList t
5a40: 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a  o Expr.flags,.**
5a50: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
5a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a70: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
5a80: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
5a90: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5aa0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
5ab0: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
5ac0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5ad0: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
5ae0: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
5af0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5b00: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5b10: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5b20: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
5b30: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
5b40: 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74  e if( p->x.pList
5b50: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
5b60: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
5b70: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
5b80: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20      p->flags |= 
5b90: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73  EP_Propagate & s
5ba0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
5bb0: 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  ags(p->x.pList);
5bc0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
5bd0: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
5be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
5bf0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
5c00: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
5c10: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
5c20: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
5c30: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
5c40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
5c50: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
5c60: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
5c70: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
5c80: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
5c90: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
5ca0: 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70  gate all EP_Prop
5cb0: 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d  agate flags from
5cc0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
5cd0: 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66  t into.** Expr.f
5ce0: 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  lags. .*/.void s
5cf0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
5d00: 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73  ghtAndFlags(Pars
5d10: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
5d20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  *p){.  if( pPars
5d30: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
5d40: 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68  ;.  exprSetHeigh
5d50: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t(p);.  sqlite3E
5d60: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
5d70: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
5d80: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
5d90: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
5da0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
5db0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
5dc0: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
5dd0: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
5de0: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
5df0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
5e00: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
5e10: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
5e20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5e30: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5e40: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
5e50: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
5e60: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73   nHeight;.}.#els
5e70: 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69  e /* ABOVE:  Hei
5e80: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
5e90: 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a  enabled.  BELOW:
5ea0: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
5eb0: 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a  ent off */./*.**
5ec0: 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   Propagate all E
5ed0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5ee0: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
5ef0: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
5f00: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
5f10: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5f20: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
5f30: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
5f40: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5f50: 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74   p && p->x.pList
5f60: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
5f70: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
5f80: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  lect) ){.    p->
5f90: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
5fa0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
5fb0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
5fc0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  x.pList);.  }.}.
5fd0: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
5fe0: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
5ff0: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
6000: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
6010: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6020: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
6030: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
6040: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
6050: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
6060: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
6070: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
6080: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
6090: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
60a0: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
60b0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
60c0: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
60d0: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
60e0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
60f0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
6100: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
6110: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
6120: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
6130: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
6140: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
6150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
6160: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
6170: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
6180: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
6190: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
61a0: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
61b0: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
61c0: 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64  erformed.  The d
61d0: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
61e0: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
61f0: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
6200: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
6210: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
6220: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
6230: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
6240: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
6250: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
6260: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
6270: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
6280: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
6290: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
62a0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
62b0: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
62c0: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
62d0: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
62e0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
62f0: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
6300: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
6310: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
6320: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
6330: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
6340: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
6350: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
6360: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
6370: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
6380: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
6390: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
63a0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
63b0: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
63c0: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
63d0: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
63e0: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
63f0: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
6400: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
6410: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
6420: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6430: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
6440: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6450: 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74  RawNN() */.  int
6460: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6470: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6480: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
6490: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
64a0: 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  en,    /* Token 
64b0: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
64c0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
64d0: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
64e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
64f0: 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20   dequote */.){. 
6500: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
6510: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
6520: 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b   int iValue = 0;
6530: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
6540: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
6550: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21  n ){.    if( op!
6560: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70  =TK_INTEGER || p
6570: 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20  Token->z==0.    
6580: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
6590: 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d  GetInt32(pToken-
65a0: 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20  >z, &iValue)==0 
65b0: 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  ){.      nExtra 
65c0: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20  = pToken->n+1;. 
65d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61       assert( iVa
65e0: 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  lue>=0 );.    }.
65f0: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c    }.  pNew = sql
6600: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
6610: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
6620: 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66  r)+nExtra);.  if
6630: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65  ( pNew ){.    me
6640: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
6650: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20  zeof(Expr));.   
6660: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
6670: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
6680: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
6690: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
66a0: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
66b0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
66c0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
66d0: 61 6c 75 65 7c 45 50 5f 4c 65 61 66 3b 0a 20 20  alue|EP_Leaf;.  
66e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
66f0: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
6700: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6710: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6720: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
6730: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6740: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6750: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
6760: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
6770: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
6780: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
6790: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
67a0: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
67b0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
67c0: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
67d0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
67e0: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
67f0: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
6800: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
6810: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
6820: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
6830: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6840: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6850: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
6860: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
6870: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
6880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6890: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
68a0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
68b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
68c0: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
68d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
68e0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
68f0: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
6900: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
6910: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
6920: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
6930: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6940: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6950: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
6960: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6980: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
6990: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
69a0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
69b0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
69c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
69d0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
69e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
69f0: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
6a00: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
6a10: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6a20: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
6a30: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6a40: 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    x.n = sqlite3S
6a50: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 3b  trlen30(zToken);
6a60: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
6a70: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f  3ExprAlloc(db, o
6a80: 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  p, &x, 0);.}../*
6a90: 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74 72  .** Attach subtr
6aa0: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
6ab0: 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70 72  ight to the Expr
6ac0: 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a   node pRoot..**.
6ad0: 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c  ** If pRoot==NUL
6ae0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  L that means tha
6af0: 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  t a memory alloc
6b00: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
6b10: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
6b20: 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74  that case, delet
6b30: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 70  e the subtrees p
6b40: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
6b50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6b60: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
6b70: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  es(.  sqlite3 *d
6b80: 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74  b,.  Expr *pRoot
6b90: 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  ,.  Expr *pLeft,
6ba0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a  .  Expr *pRight.
6bb0: 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d  ){.  if( pRoot==
6bc0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
6bd0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6be0: 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
6bf0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
6c00: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
6c10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6c20: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
6c30: 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  e{.    if( pRigh
6c40: 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  t ){.      pRoot
6c50: 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68  ->pRight = pRigh
6c60: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c70: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c80: 61 67 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e  agate & pRight->
6c90: 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20  flags;.    }.   
6ca0: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
6cb0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74      pRoot->pLeft
6cc0: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
6cd0: 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pRoot->flags |= 
6ce0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70  EP_Propagate & p
6cf0: 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Left->flags;.   
6d00: 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65   }.    exprSetHe
6d10: 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d  ight(pRoot);.  }
6d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
6d30: 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20  te an Expr node 
6d40: 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d  which joins as m
6d50: 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72  any as two subtr
6d60: 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f  ees..**.** One o
6d70: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75  r both of the su
6d80: 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55  btrees can be NU
6d90: 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  LL.  Return a po
6da0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
6db0: 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  .** Expr node.  
6dc0: 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  Or, if an OOM er
6dd0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
6de0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
6df0: 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65  ocFailed,.** fre
6e00: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61  e the subtrees a
6e10: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
6e20: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6e30: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
6e40: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
6e50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6e60: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
6e90: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
6ea0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
6eb0: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
6ec0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
6ed0: 69 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20  ight            
6ee0: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
6ef0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
6f00: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
6f10: 4e 44 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  ND && pParse->nE
6f20: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  rr==0 ){.    /* 
6f30: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
6f40: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
6f50: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
6f60: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
6f70: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
6f80: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
6f90: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
6fa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
6fb0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6fc0: 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
6fd0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
6fe0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
6ff0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
7000: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
7010: 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f  .      p->op = o
7020: 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a  p & TKFLG_MASK;.
7030: 20 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20        p->iAgg = 
7040: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  -1;.    }.    sq
7050: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
7060: 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e  ubtrees(pParse->
7070: 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52  db, p, pLeft, pR
7080: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ight);.  }.  if(
7090: 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74   p ) {.    sqlit
70a0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
70b0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
70c0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ight);.  }.  ret
70d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
70e0: 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74  Add pSelect to t
70f0: 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  he Expr.x.pSelec
7100: 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66  t field.  Or, if
7110: 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28   pExpr is NULL (
7120: 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f  due.** do a memo
7130: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
7140: 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65  ilure) then dele
7150: 74 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f  te the pSelect o
7160: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
7170: 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
7180: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
7190: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
71a0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
71b0: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  ){.  if( pExpr )
71c0: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70  {.    pExpr->x.p
71d0: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
71e0: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  ;.    ExprSetPro
71f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7200: 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62  xIsSelect|EP_Sub
7210: 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  query);.    sqli
7220: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
7230: 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c  AndFlags(pParse,
7240: 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65   pExpr);.  }else
7250: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7260: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
7270: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
7280: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
7290: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
72a0: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  elect);.  }.}...
72b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
72c0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
72d0: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
72e0: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
72f0: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
7300: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
7310: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
7320: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
7330: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
7340: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
7350: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
7360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
7370: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
7380: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
7390: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
73a0: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
73b0: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
73c0: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
73d0: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
73e0: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
73f0: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
7400: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
7410: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
7420: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
7430: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
7440: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
7450: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
7460: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
7470: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
7480: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7490: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
74a0: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
74b0: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
74c0: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
74d0: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
74e0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
74f0: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
7500: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
7510: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
7520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
7530: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
7540: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
7550: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
7560: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
7570: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
7580: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
7590: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
75a0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
75b0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
75c0: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
75d0: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
75e0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
75f0: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7600: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7610: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
7620: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7630: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
7640: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
7650: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
7660: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
7670: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
7680: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
7690: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
76a0: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
76b0: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
76c0: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
76d0: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
76e0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
76f0: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
7700: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
7710: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
7720: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
7730: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
7740: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
7750: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
7760: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
7770: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
7780: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
7790: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
77a0: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
77b0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
77c0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
77d0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
77e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
77f0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
7800: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
7810: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
7820: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
7830: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
7840: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
7850: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
7860: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
7870: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7880: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
7890: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
78a0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
78b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
78c0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
78d0: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
78e0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
78f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
7900: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
7910: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7920: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
7930: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
7940: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
7950: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
7960: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
7970: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
7980: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
7990: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
79a0: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
79b0: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
79c0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
79d0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
79e0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 50  xprFunction(.  P
79f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7a00: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
7a10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
7a20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
7a30: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6c     /* Argument l
7a40: 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
7a50: 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f  pToken,        /
7a60: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75  * Name of the fu
7a70: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
7a80: 65 44 69 73 74 69 6e 63 74 20 20 20 20 20 20 20  eDistinct       
7a90: 20 20 2f 2a 20 53 46 5f 44 69 73 74 69 6e 63 74    /* SF_Distinct
7aa0: 20 6f 72 20 53 46 5f 41 4c 4c 20 6f 72 20 30 20   or SF_ALL or 0 
7ab0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
7ac0: 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ew;.  sqlite3 *d
7ad0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7ae0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
7af0: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
7b00: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
7b10: 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70  , TK_FUNCTION, p
7b20: 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28  Token, 1);.  if(
7b30: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
7b40: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7b50: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
7b60: 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72  ; /* Avoid memor
7b70: 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c  y leak when mall
7b80: 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  oc fails */.    
7b90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7ba0: 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
7bb0: 73 74 2d 3e 6e 45 78 70 72 20 3e 20 70 50 61 72  st->nExpr > pPar
7bc0: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
7bd0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
7be0: 54 49 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20 20  TION_ARG] ){.   
7bf0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7c00: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
7c10: 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20  ny arguments on 
7c20: 66 75 6e 63 74 69 6f 6e 20 25 54 22 2c 20 70 54  function %T", pT
7c30: 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  oken);.  }.  pNe
7c40: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
7c50: 73 74 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f  st;.  ExprSetPro
7c60: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 48  perty(pNew, EP_H
7c70: 61 73 46 75 6e 63 29 3b 0a 20 20 61 73 73 65 72  asFunc);.  asser
7c80: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
7c90: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
7ca0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
7cb0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
7cc0: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
7cd0: 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 65  , pNew);.  if( e
7ce0: 44 69 73 74 69 6e 63 74 3d 3d 53 46 5f 44 69 73  Distinct==SF_Dis
7cf0: 74 69 6e 63 74 20 29 20 45 78 70 72 53 65 74 50  tinct ) ExprSetP
7d00: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
7d10: 5f 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 72 65  _Distinct);.  re
7d20: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7d30: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
7d40: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
7d50: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
7d60: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
7d70: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
7d80: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
7d90: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
7da0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
7db0: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
7dc0: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
7dd0: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
7de0: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
7df0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
7e00: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
7e10: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
7e20: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
7e30: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
7e40: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
7e50: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69  n" is not too bi
7e60: 67 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e  g to avoid a den
7e70: 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61  ial of service a
7e80: 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68  ttack when.** th
7e90: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
7ea0: 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78  comes from an ex
7eb0: 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a  ternal source..*
7ec0: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
7ed0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
7ee0: 22 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24  ", "@aaa", or "$
7ef0: 61 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65  aaa" are assigne
7f00: 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  d the same numbe
7f10: 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76  r.** as the prev
7f20: 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66  ious instance of
7f30: 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61   the same wildca
7f40: 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20  rd.  Or if this 
7f50: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
7f60: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
7f70: 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65  wildcard, the ne
7f80: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61  xt sequential va
7f90: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73  riable number is
7fa0: 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f  .** assigned..*/
7fb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
7fc0: 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72  rAssignVarNumber
7fd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7fe0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32  Expr *pExpr, u32
7ff0: 20 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a   n){.  sqlite3 *
8000: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8010: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8020: 3b 0a 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20  ;.  ynVar x;..  
8030: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
8040: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
8050: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
8060: 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
8070: 61 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c  alue|EP_Reduced|
8080: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b  EP_TokenOnly) );
8090: 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e  .  z = pExpr->u.
80a0: 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  zToken;.  assert
80b0: 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( z!=0 );.  asse
80c0: 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20  rt( z[0]!=0 );. 
80d0: 20 61 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32   assert( n==(u32
80e0: 29 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  )sqlite3Strlen30
80f0: 28 7a 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31  (z) );.  if( z[1
8100: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ]==0 ){.    /* W
8110: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
8120: 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e  orm "?".  Assign
8130: 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62   the next variab
8140: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
8150: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27   assert( z[0]=='
8160: 3f 27 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79  ?' );.    x = (y
8170: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
8180: 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nVar);.  }else{.
8190: 20 20 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20      int doAdd = 
81a0: 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  0;.    if( z[0]=
81b0: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='?' ){.      /*
81c0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
81d0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43   form "?nnn".  C
81e0: 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20  onvert "nnn" to 
81f0: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20  an integer and. 
8200: 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61       ** use it a
8210: 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  s the variable n
8220: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  umber */.      i
8230: 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  64 i;.      int 
8240: 62 4f 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  bOk;.      if( n
8250: 3d 3d 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  ==2 ){ /*OPTIMIZ
8260: 41 54 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a  ATION-IF-TRUE*/.
8270: 20 20 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d          i = z[1]
8280: 2d 27 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f  -'0';  /* The co
8290: 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20  mmon case of ?N 
82a0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67  for a single dig
82b0: 69 74 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  it N */.        
82c0: 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  bOk = 1;.      }
82d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f  else{.        bO
82e0: 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74  k = 0==sqlite3At
82f0: 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20  oi64(&z[1], &i, 
8300: 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  n-1, SQLITE_UTF8
8310: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8320: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20   testcase( i==0 
8330: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8340: 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20  e( i==1 );.     
8350: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
8360: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8370: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8380: 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20  UMBER]-1 );.    
8390: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
83a0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
83b0: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
83c0: 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20  NUMBER] );.     
83d0: 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69   if( bOk==0 || i
83e0: 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d  <1 || i>db->aLim
83f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8400: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
8410: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8420: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8430: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
8440: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
8450: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
8460: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  ,.            db
8470: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8480: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8490: 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20  UMBER]);.       
84a0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
84b0: 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61  .      x = (ynVa
84c0: 72 29 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78  r)i;.      if( x
84d0: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
84e0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
84f0: 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a  >nVar = (int)x;.
8500: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
8510: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
8520: 66 28 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  f( sqlite3VListN
8530: 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d  umToName(pParse-
8540: 3e 70 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29  >pVList, x)==0 )
8550: 7b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64 20  {.        doAdd 
8560: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
8570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
8580: 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20   Wildcards like 
8590: 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f  ":aaa", "$aaa" o
85a0: 72 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65  r "@aaa".  Reuse
85b0: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
85c0: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  le.      ** numb
85d0: 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20  er as the prior 
85e0: 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68  appearance of th
85f0: 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20  e same name, or 
8600: 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20  if the name.    
8610: 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61    ** has never a
8620: 70 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20  ppeared before, 
8630: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  reuse the same v
8640: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20  ariable number. 
8650: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20       */.      x 
8660: 3d 20 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33  = (ynVar)sqlite3
8670: 56 4c 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70  VListNameToNum(p
8680: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a  Parse->pVList, z
8690: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
86a0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
86b0: 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  x = (ynVar)(++pP
86c0: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
86d0: 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a       doAdd = 1;.
86e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
86f0: 20 20 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20    if( doAdd ){. 
8700: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c       pParse->pVL
8710: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69  ist = sqlite3VLi
8720: 73 74 41 64 64 28 64 62 2c 20 70 50 61 72 73 65  stAdd(db, pParse
8730: 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20  ->pVList, z, n, 
8740: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  x);.    }.  }.  
8750: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
8760: 20 78 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e   x;.  if( x>db->
8770: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8780: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
8790: 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  BER] ){.    sqli
87a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
87b0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51  se, "too many SQ
87c0: 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20  L variables");. 
87d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75   }.}../*.** Recu
87e0: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
87f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
8800: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
8810: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
8820: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
8830: 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64  eteNN(sqlite3 *d
8840: 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61  b, Expr *p){.  a
8850: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
8860: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
8870: 3a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  : Assert that th
8880: 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f  e IntValue is no
8890: 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69 74  n-negative if it
88a0: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73   exists */.  ass
88b0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
88c0: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
88d0: 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56  alue) || p->u.iV
88e0: 61 6c 75 65 3e 3d 30 20 29 3b 0a 23 69 66 64 65  alue>=0 );.#ifde
88f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8900: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8910: 65 72 74 79 28 70 2c 20 45 50 5f 4c 65 61 66 29  erty(p, EP_Leaf)
8920: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
8930: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8940: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73  Only) ){.    ass
8950: 65 72 74 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30  ert( p->pLeft==0
8960: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8970: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
8980: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78      assert( p->x
8990: 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  .pSelect==0 );. 
89a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
89b0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
89c0: 28 70 2c 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  (p, (EP_TokenOnl
89d0: 79 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20  y|EP_Leaf)) ){. 
89e0: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
89f0: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
8a00: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
8a10: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
8a20: 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ight */.    asse
8a30: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
8a40: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
8a50: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
8a60: 70 4c 65 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d  pLeft && p->op!=
8a70: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
8a80: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
8a90: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c  leteNN(db, p->pL
8aa0: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  eft);.    if( p-
8ab0: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
8ac0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8ad0: 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 52 69 67  teNN(db, p->pRig
8ae0: 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ht);.    }else i
8af0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8b00: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
8b10: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
8b20: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
8b30: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
8b40: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
8b50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8b60: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
8b70: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
8b80: 7d 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  }.    if( !ExprH
8b90: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8ba0: 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20  _Reduced) ){.   
8bb0: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
8bc0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57  Delete(db, p->pW
8bd0: 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  in);.    }.  }. 
8be0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8bf0: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
8c00: 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62  ken) ) sqlite3Db
8c10: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
8c20: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 45 78  oken);.  if( !Ex
8c30: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8c40: 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20   EP_Static) ){. 
8c50: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8c60: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  NN(db, p);.  }.}
8c70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
8c80: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
8c90: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
8ca0: 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33   if( p ) sqlite3
8cb0: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8cc0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
8cd0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8ce0: 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
8cf0: 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ed for the expre
8d00: 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20  ssion structure 
8d10: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
8d20: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8d30: 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
8d40: 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c   one of EXPR_FUL
8d50: 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52  LSIZE,.** EXPR_R
8d60: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58  EDUCEDSIZE or EX
8d70: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8d80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8d90: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  exprStructSize(E
8da0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45  xpr *p){.  if( E
8db0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8dc0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
8dd0: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f  ) return EXPR_TO
8de0: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69  KENONLYSIZE;.  i
8df0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8e00: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
8e10: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
8e20: 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72  REDUCEDSIZE;.  r
8e30: 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53  eturn EXPR_FULLS
8e40: 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  IZE;.}../*.** Th
8e50: 65 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65  e dupedExpr*Size
8e60: 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68  () routines each
8e70: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
8e80: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
8e90: 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ired.** to store
8ea0: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
8eb0: 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72  pression or expr
8ec0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68  ession tree.  Th
8ed0: 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20  ey differ in.** 
8ee0: 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20  how much of the 
8ef0: 74 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64  tree is measured
8f00: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65  ..**.**     dupe
8f10: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
8f20: 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e  )     Size of on
8f30: 6c 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75  ly the Expr stru
8f40: 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75  cture .**     du
8f50: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
8f60: 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20  )       Size of 
8f70: 45 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72  Expr + space for
8f80: 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75   token.**     du
8f90: 70 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20  pedExprSize()   
8fa0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74          Expr + t
8fb0: 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63  oken + subtree c
8fc0: 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a  omponents.**.***
8fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9010: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
9020: 68 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75  he dupedExprStru
9030: 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f  ctSize() functio
9040: 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61  n returns two va
9050: 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74  lues OR-ed toget
9060: 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68  her:  .** (1) th
9070: 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  e space required
9080: 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74   for a copy of t
9090: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
90a0: 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28  e only and .** (
90b0: 32 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c  2) the EP_xxx fl
90c0: 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74  ags that indicat
90d0: 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63  e what the struc
90e0: 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64  ture size should
90f0: 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75   be..** The retu
9100: 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77  rn values is alw
9110: 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a  ays one of:.**.*
9120: 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c  *      EXPR_FULL
9130: 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50  SIZE.**      EXP
9140: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20  R_REDUCEDSIZE   
9150: 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20  | EP_Reduced.** 
9160: 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f       EXPR_TOKENO
9170: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
9180: 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65  enOnly.**.** The
9190: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72   size of the str
91a0: 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f  ucture can be fo
91b0: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
91c0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
91d0: 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ** of this routi
91e0: 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20  ne with 0xfff.  
91f0: 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65  The flags can be
9200: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
9210: 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20  g the.** return 
9220: 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65  value with EP_Re
9230: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
9240: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ly..**.** Note t
9250: 68 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d  hat with flags==
9260: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
9270: 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f  this routines wo
9280: 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65  rks on full-size
9290: 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20  .** (unreduced) 
92a0: 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20  Expr objects as 
92b0: 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c  they or original
92c0: 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ly constructed b
92d0: 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a  y the parser..**
92e0: 20 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69   During expressi
92f0: 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74  on analysis, ext
9300: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
9310: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d  s computed and m
9320: 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74  oved into.** lat
9330: 65 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  er parts of the 
9340: 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  Expr object and 
9350: 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72  that extra infor
9360: 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74  mation might get
9370: 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20   chopped.** off 
9380: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
9390: 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e  n is reduced.  N
93a0: 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74  ote also that it
93b0: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74   does not work t
93c0: 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50  o.** make an EXP
93d0: 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79  RDUP_REDUCE copy
93e0: 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78   of a reduced ex
93f0: 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73  pression.  It is
9400: 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74   only legal.** t
9410: 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74  o reduce a prist
9420: 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ine expression t
9430: 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ree from the par
9440: 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d  ser.  The implem
9450: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64  entation.** of d
9460: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
9470: 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c  ze() contain mul
9480: 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73  tiple assert() s
9490: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61  tatements that a
94a0: 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66  ttempt.** to enf
94b0: 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72  orce this constr
94c0: 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aint..*/.static 
94d0: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72  int dupedExprStr
94e0: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  uctSize(Expr *p,
94f0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
9500: 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65  nt nSize;.  asse
9510: 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  rt( flags==EXPRD
9520: 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61  UP_REDUCE || fla
9530: 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79  gs==0 ); /* Only
9540: 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20   one flag value 
9550: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73  allowed */.  ass
9560: 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49  ert( EXPR_FULLSI
9570: 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61  ZE<=0xfff );.  a
9580: 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20  ssert( (0xfff & 
9590: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
95a0: 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b  okenOnly))==0 );
95b0: 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20  .  if( 0==flags 
95c0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  || p->op==TK_SEL
95d0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 0a 23 69 66 6e  ECT_COLUMN .#ifn
95e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
95f0: 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 7c 7c  WINDOWFUNC.   ||
9600: 20 70 2d 3e 70 57 69 6e 20 0a 23 65 6e 64 69 66   p->pWin .#endif
9610: 0a 20 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  .  ){.    nSize 
9620: 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  = EXPR_FULLSIZE;
9630: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
9640: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
9650: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
9660: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
9670: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
9680: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9690: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
96a0: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
96b0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
96c0: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
96d0: 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  en) );.    asser
96e0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
96f0: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
9700: 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ce) );.    if( p
9710: 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e  ->pLeft || p->x.
9720: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
9730: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
9740: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
9750: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
9760: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9770: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
9780: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
9790: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20  R_TOKENONLYSIZE 
97a0: 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  | EP_TokenOnly;.
97b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
97c0: 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nSize;.}../*.
97d0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
97e0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61   returns the spa
97f0: 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75  ce in bytes requ
9800: 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
9810: 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68  e copy .** of th
9820: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
9830: 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
9840: 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  he Expr.u.zToken
9850: 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74   string (if that
9860: 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65  .** string is de
9870: 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  fined.).*/.stati
9880: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e  c int dupedExprN
9890: 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  odeSize(Expr *p,
98a0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
98b0: 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64  nt nByte = duped
98c0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
98d0: 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66  , flags) & 0xfff
98e0: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
98f0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
9900: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
9910: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e  .zToken ){.    n
9920: 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
9930: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
9940: 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65  ken)+1;.  }.  re
9950: 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74  turn ROUND8(nByt
9960: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
9970: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
9980: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
9990: 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70   to create a dup
99a0: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a  licate of the .*
99b0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  * expression pas
99c0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
99d0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73   argument. The s
99e0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
99f0: 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74  s a.** mask cont
9a00: 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58  aining EXPRDUP_X
9a10: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  XX flags..**.** 
9a20: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
9a30: 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63  ed includes spac
9a40: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  e to create a co
9a50: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
9a60: 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20  truct.** itself 
9a70: 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72  and the buffer r
9a80: 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78  eferred to by Ex
9a90: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20  pr.u.zToken, if 
9aa0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  any..**.** If th
9ab0: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
9ac0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
9ad0: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
9ae0: 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a  lue includes .**
9af0: 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63   space to duplic
9b00: 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64  ate all Expr nod
9b10: 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66  es in the tree f
9b20: 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c  ormed by Expr.pL
9b30: 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72  eft .** and Expr
9b40: 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65  .pRight variable
9b50: 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61  s (but not for a
9b60: 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f  ny structures po
9b70: 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20  inted to or .** 
9b80: 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74  descended from t
9b90: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
9ba0: 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  or Expr.x.pSelec
9bb0: 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f  t variables)..*/
9bc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
9bd0: 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a  dExprSize(Expr *
9be0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
9bf0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a   int nByte = 0;.
9c00: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e    if( p ){.    n
9c10: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
9c20: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67  NodeSize(p, flag
9c30: 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  s);.    if( flag
9c40: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
9c50: 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20   ){.      nByte 
9c60: 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  += dupedExprSize
9c70: 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73  (p->pLeft, flags
9c80: 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a  ) + dupedExprSiz
9c90: 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61  e(p->pRight, fla
9ca0: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
9cb0: 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d   return nByte;.}
9cc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9cd0: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
9ce0: 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44   to sqlite3ExprD
9cf0: 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  up(), except tha
9d00: 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a  t if pzBuffer .*
9d10: 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  * is not NULL th
9d20: 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  en *pzBuffer is 
9d30: 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
9d40: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72   to a buffer lar
9d50: 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f  ge enough .** to
9d60: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
9d70: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c  of expression p,
9d80: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70   the copies of p
9d90: 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69  ->u.zToken.** (i
9da0: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61  f applicable), a
9db0: 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  nd the copies of
9dc0: 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e   the p->pLeft an
9dd0: 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72  d p->pRight expr
9de0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61  essions,.** if a
9df0: 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  ny. Before retur
9e00: 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20  ning, *pzBuffer 
9e10: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69  is set to the fi
9e20: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
9e30: 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20  e.** portion of 
9e40: 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65  the buffer copie
9e50: 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66  d into by this f
9e60: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
9e70: 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70  ic Expr *exprDup
9e80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
9e90: 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c  pr *p, int dupFl
9ea0: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
9eb0: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
9ec0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
9ed0: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
9ee0: 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b  */.  u8 *zAlloc;
9ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
9f00: 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20  mory space from 
9f10: 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45  which to build E
9f20: 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  xpr object */.  
9f30: 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20  u32 staticFlag; 
9f40: 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74        /* EP_Stat
9f50: 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20  ic if space not 
9f60: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
9f70: 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72  lloc */..  asser
9f80: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
9f90: 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73  sert( p );.  ass
9fa0: 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30  ert( dupFlags==0
9fb0: 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58   || dupFlags==EX
9fc0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a  PRDUP_REDUCE );.
9fd0: 20 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66    assert( pzBuff
9fe0: 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67  er==0 || dupFlag
9ff0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
a000: 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  E );..  /* Figur
a010: 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77  e out where to w
a020: 72 69 74 65 20 74 68 65 20 6e 65 77 20 45 78 70  rite the new Exp
a030: 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  r structure. */.
a040: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
a050: 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a  {.    zAlloc = *
a060: 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74  pzBuffer;.    st
a070: 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74  aticFlag = EP_St
a080: 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  atic;.  }else{. 
a090: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69     zAlloc = sqli
a0a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
a0b0: 28 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69  (db, dupedExprSi
a0c0: 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29  ze(p, dupFlags))
a0d0: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
a0e0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
a0f0: 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f   = (Expr *)zAllo
a100: 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29  c;..  if( pNew )
a110: 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65  {.    /* Set nNe
a120: 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  wSize to the siz
a130: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
a140: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  the structure po
a150: 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  inted to.    ** 
a160: 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73  by pNew. This is
a170: 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c   either EXPR_FUL
a180: 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55  LSIZE, EXPR_REDU
a190: 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a  CEDSIZE or.    *
a1a0: 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  * EXPR_TOKENONLY
a1b0: 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20  SIZE. nToken is 
a1c0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
a1d0: 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75  r of bytes consu
a1e0: 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  med.    ** by th
a1f0: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d  e copy of the p-
a200: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
a210: 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
a220: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  /.    const unsi
a230: 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65  gned nStructSize
a240: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
a250: 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  ctSize(p, dupFla
a260: 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  gs);.    const i
a270: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
a280: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
a290: 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  f;.    int nToke
a2a0: 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  n;.    if( !Expr
a2b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
a2c0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
a2d0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
a2e0: 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c      nToken = sql
a2f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
a300: 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20  u.zToken) + 1;. 
a310: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a320: 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nToken = 0;.    
a330: 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c 61  }.    if( dupFla
a340: 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gs ){.      asse
a350: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
a360: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
a370: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d  d)==0 );.      m
a380: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
a390: 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20   nNewSize);.    
a3a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32  }else{.      u32
a3b0: 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78   nSize = (u32)ex
a3c0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
a3d0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
a3e0: 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b  lloc, p, nSize);
a3f0: 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65  .      if( nSize
a400: 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29  <EXPR_FULLSIZE )
a410: 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  { .        memse
a420: 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d  t(&zAlloc[nSize]
a430: 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49  , 0, EXPR_FULLSI
a440: 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  ZE-nSize);.     
a450: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a460: 20 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75   Set the EP_Redu
a470: 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ced, EP_TokenOnl
a480: 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63  y, and EP_Static
a490: 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61   flags appropria
a4a0: 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65  tely. */.    pNe
a4b0: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
a4c0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
a4d0: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c  nOnly|EP_Static|
a4e0: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20  EP_MemToken);.  
a4f0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
a500: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28   nStructSize & (
a510: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
a520: 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e  kenOnly);.    pN
a530: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61  ew->flags |= sta
a540: 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a  ticFlag;..    /*
a550: 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a   Copy the p->u.z
a560: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66  Token string, if
a570: 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
a580: 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   nToken ){.     
a590: 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20   char *zToken = 
a5a0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
a5b0: 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b   (char*)&zAlloc[
a5c0: 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20  nNewSize];.     
a5d0: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
a5e0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
a5f0: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ken);.    }..   
a600: 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61   if( 0==((p->fla
a610: 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20  gs|pNew->flags) 
a620: 26 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  & (EP_TokenOnly|
a630: 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20  EP_Leaf)) ){.   
a640: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
a650: 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63  e pNew->x.pSelec
a660: 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69  t or pNew->x.pLi
a670: 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20  st member. */.  
a680: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
a690: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
a6a0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
a6b0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
a6c0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
a6d0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
a6e0: 70 53 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67  pSelect, dupFlag
a6f0: 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s);.      }else{
a700: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
a710: 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  .pList = sqlite3
a720: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
a730: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46  p->x.pList, dupF
a740: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lags);.      }. 
a750: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c     }..    /* Fil
a760: 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74  l in pNew->pLeft
a770: 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68   and pNew->pRigh
a780: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78  t. */.    if( Ex
a790: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
a7a0: 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ew, EP_Reduced|E
a7b0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
a7c0: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20        zAlloc += 
a7d0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
a7e0: 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  e(p, dupFlags);.
a7f0: 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48        if( !ExprH
a800: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
a810: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
a820: 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  _Leaf) ){.      
a830: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
a840: 70 2d 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20 20  p->pLeft ?.     
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a860: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
a870: 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52  pLeft, EXPRDUP_R
a880: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20  EDUCE, &zAlloc) 
a890: 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  : 0;.        pNe
a8a0: 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e 70  w->pRight = p->p
a8b0: 52 69 67 68 74 20 3f 0a 20 20 20 20 20 20 20 20  Right ?.        
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
a8d0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
a8e0: 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45  ight, EXPRDUP_RE
a8f0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a  DUCE, &zAlloc) :
a900: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
a910: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
a920: 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66  {.        *pzBuf
a930: 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20  fer = zAlloc;.  
a940: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
a950: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a960: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
a970: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
a980: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
a990: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a9a0: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
a9b0: 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b   pNew->pWin = 0;
a9c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a9d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e        pNew->pWin
a9e0: 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77   = sqlite3Window
a9f0: 44 75 70 28 64 62 2c 20 70 4e 65 77 2c 20 70 2d  Dup(db, pNew, p-
aa00: 3e 70 57 69 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  >pWin);.      }.
aa10: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
aa20: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
aa30: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 45   */.      if( !E
aa40: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
aa50: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
aa60: 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20  P_Leaf) ){.     
aa70: 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d     if( pNew->op=
aa80: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
aa90: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  N ){.          p
aaa0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e  New->pLeft = p->
aab0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
aac0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c   assert( p->iCol
aad0: 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  umn==0 || p->pRi
aae0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
aaf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
ab00: 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e  Right==0  || p->
ab10: 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74  pRight==p->pLeft
ab20: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
ab30: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
ab40: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
ab50: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
ab60: 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
ab70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e      }.        pN
ab80: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
ab90: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
aba0: 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  p->pRight, 0);. 
abb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
abc0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
abd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
abe0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65  and return a dee
abf0: 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62  p copy of the ob
ac00: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
ac10: 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72  he second .** ar
ac20: 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f  gument. If an OO
ac30: 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65  M condition is e
ac40: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c  ncountered, NULL
ac50: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
ac60: 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  and the db->mall
ac70: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65  ocFailed flag se
ac80: 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
ac90: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74  LITE_OMIT_CTE.st
aca0: 61 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44  atic With *withD
acb0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
acc0: 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68  With *p){.  With
acd0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
ace0: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ( p ){.    int n
acf0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
ad00: 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  ) + sizeof(p->a[
ad10: 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31  0]) * (p->nCte-1
ad20: 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  );.    pRet = sq
ad30: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
ad40: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
ad50: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
ad60: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
ad70: 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d   pRet->nCte = p-
ad80: 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72  >nCte;.      for
ad90: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b  (i=0; i<p->nCte;
ada0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
adb0: 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Ret->a[i].pSelec
adc0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
add0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
ade0: 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
adf0: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
ae00: 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33  .pCols = sqlite3
ae10: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
ae20: 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30  p->a[i].pCols, 0
ae30: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
ae40: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
ae50: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
ae60: 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
ae70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ae80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
ae90: 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
aea0: 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29  ine withDup(x,y)
aeb0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
aec0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
aed0: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
aee0: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
aef0: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
af00: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
af10: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
af20: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
af30: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
af40: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
af50: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
af60: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
af70: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
af80: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
af90: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
afa0: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
afb0: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
afc0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
afd0: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
afe0: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
aff0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
b000: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
b010: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
b020: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
b030: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
b040: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
b050: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
b060: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
b070: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
b080: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
b090: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
b0a0: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
b0b0: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
b0c0: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a  t duplicated..**
b0d0: 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
b0e0: 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73  rameter contains
b0f0: 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
b100: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58  f the EXPRDUP_XX
b110: 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74  X flags..** If t
b120: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
b130: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
b140: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
b150: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a  e returned is a.
b160: 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72  ** truncated ver
b170: 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61  sion of the usua
b180: 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  l Expr structure
b190: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74   that will be st
b1a0: 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  ored as.** part 
b1b0: 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
b1c0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
b1d0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
b1e0: 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20  schema..*/.Expr 
b1f0: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
b200: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
b210: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
b220: 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  {.  assert( flag
b230: 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45  s==0 || flags==E
b240: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b  XPRDUP_REDUCE );
b250: 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20 65 78  .  return p ? ex
b260: 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61  prDup(db, p, fla
b270: 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a 45 78  gs, 0) : 0;.}.Ex
b280: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
b290: 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74  xprListDup(sqlit
b2a0: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
b2b0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
b2c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65  .  ExprList *pNe
b2d0: 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  w;.  struct Expr
b2e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
b2f0: 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69  , *pOldItem;.  i
b300: 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 50  nt i;.  Expr *pP
b310: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20  riorSelectCol = 
b320: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  0;.  assert( db!
b330: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
b340: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b350: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
b360: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
b370: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
b380: 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20 20 69 66  ze(db, p));.  if
b390: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
b3a0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45  rn 0;.  pNew->nE
b3b0: 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  xpr = p->nExpr;.
b3c0: 20 20 70 49 74 65 6d 20 3d 20 70 4e 65 77 2d 3e    pItem = pNew->
b3d0: 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20  a;.  pOldItem = 
b3e0: 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p->a;.  for(i=0;
b3f0: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
b400: 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49  , pItem++, pOldI
b410: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
b420: 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c   *pOldExpr = pOl
b430: 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  dItem->pExpr;.  
b440: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
b450: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
b460: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
b470: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
b480: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
b490: 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20 20 20  ( pOldExpr .    
b4a0: 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e 6f 70   && pOldExpr->op
b4b0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  ==TK_SELECT_COLU
b4c0: 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e 65 77  MN.     && (pNew
b4d0: 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Expr = pItem->pE
b4e0: 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  xpr)!=0 .    ){.
b4f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
b500: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
b510: 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20 20 20  =0 || i>0 );.   
b520: 20 20 20 69 66 28 20 70 4e 65 77 45 78 70 72 2d     if( pNewExpr-
b530: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20  >iColumn==0 ){. 
b540: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b550: 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  OldExpr->pLeft==
b560: 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67 68 74  pOldExpr->pRight
b570: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
b580: 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 70 4e  orSelectCol = pN
b590: 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ewExpr->pLeft = 
b5a0: 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67 68 74  pNewExpr->pRight
b5b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b5c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
b5d0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
b5e0: 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31 5d 2e  sert( pItem[-1].
b5f0: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
b600: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
b610: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
b620: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e  Item[-1].pExpr->
b630: 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 20  iColumn+1 );.   
b640: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
b650: 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d 70 49  iorSelectCol==pI
b660: 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 70  tem[-1].pExpr->p
b670: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Left );.        
b680: 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20  pNewExpr->pLeft 
b690: 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f  = pPriorSelectCo
b6a0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
b6b0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
b6c0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
b6d0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b6e0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  ->zName);.    pI
b6f0: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
b700: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b710: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e   pOldItem->zSpan
b720: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
b730: 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74  rtOrder = pOldIt
b740: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
b750: 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d     pItem->done =
b760: 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62   0;.    pItem->b
b770: 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64  SpanIsTab = pOld
b780: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
b790: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f  ;.    pItem->bSo
b7a0: 72 74 65 72 52 65 66 20 3d 20 70 4f 6c 64 49 74  rterRef = pOldIt
b7b0: 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 3b 0a  em->bSorterRef;.
b7c0: 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70      pItem->u = p
b7d0: 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a  OldItem->u;.  }.
b7e0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
b7f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
b800: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
b810: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
b820: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
b830: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
b840: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
b850: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
b860: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
b870: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
b880: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
b890: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
b8a0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
b8b0: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
b8c0: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
b8d0: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
b8e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
b8f0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
b900: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
b910: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
b920: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
b930: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
b940: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
b950: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
b960: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
b970: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
b980: 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  gs){.  SrcList *
b990: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
b9a0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61 73   int nByte;.  as
b9b0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
b9c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b9d0: 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20  rn 0;.  nByte = 
b9e0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d  sizeof(*p) + (p-
b9f0: 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66  >nSrc>0 ? sizeof
ba00: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
ba10: 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20  nSrc-1) : 0);.  
ba20: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
ba30: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
ba40: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
ba50: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
ba60: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20  0;.  pNew->nSrc 
ba70: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
ba80: 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28   p->nSrc;.  for(
ba90: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20  i=0; i<p->nSrc; 
baa0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
bab0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
bac0: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
bad0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
bae0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
baf0: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
bb00: 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  [i];.    Table *
bb10: 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74  pTab;.    pNewIt
bb20: 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f  em->pSchema = pO
bb30: 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b  ldItem->pSchema;
bb40: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
bb50: 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
bb60: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
bb70: 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  OldItem->zDataba
bb80: 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  se);.    pNewIte
bb90: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
bba0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
bbb0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
bbc0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
bbd0: 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44  Alias = sqlite3D
bbe0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
bbf0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
bc00: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20     pNewItem->fg 
bc10: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a  = pOldItem->fg;.
bc20: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
bc30: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
bc40: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
bc50: 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  NewItem->addrFil
bc60: 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  lSub = pOldItem-
bc70: 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20  >addrFillSub;.  
bc80: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52    pNewItem->regR
bc90: 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d  eturn = pOldItem
bca0: 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20  ->regReturn;.   
bcb0: 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66   if( pNewItem->f
bcc0: 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b  g.isIndexedBy ){
bcd0: 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  .      pNewItem-
bce0: 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d  >u1.zIndexedBy =
bcf0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
bd00: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75  (db, pOldItem->u
bd10: 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20  1.zIndexedBy);. 
bd20: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65     }.    pNewIte
bd30: 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 4f  m->pIBIndex = pO
bd40: 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78  ldItem->pIBIndex
bd50: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74  ;.    if( pNewIt
bd60: 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
bd70: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74   ){.      pNewIt
bd80: 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20  em->u1.pFuncArg 
bd90: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
bda0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
bdb0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31  db, pOldItem->u1
bdc0: 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67 73  .pFuncArg, flags
bdd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  );.    }.    pTa
bde0: 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54  b = pNewItem->pT
bdf0: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ab = pOldItem->p
be00: 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
be10: 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  b ){.      pTab-
be20: 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
be30: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
be40: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
be50: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
be60: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
be70: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
be80: 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71  ewItem->pOn = sq
be90: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
bea0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20   pOldItem->pOn, 
beb0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
bec0: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73  Item->pUsing = s
bed0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
bee0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55  db, pOldItem->pU
bef0: 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49  sing);.    pNewI
bf00: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70  tem->colUsed = p
bf10: 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  OldItem->colUsed
bf20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
bf30: 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73  New;.}.IdList *s
bf40: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
bf50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
bf60: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
bf70: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
bf80: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
bf90: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
bfa0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
bfb0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
bfc0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
bfd0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
bfe0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
bff0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
c000: 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20  >nId = p->nId;. 
c010: 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74   pNew->a = sqlit
c020: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
c030: 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f  db, p->nId*sizeo
c040: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
c050: 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29  if( pNew->a==0 )
c060: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
c070: 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b  reeNN(db, pNew);
c080: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c090: 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61   }.  /* Note tha
c0a0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69  t because the si
c0b0: 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ze of the alloca
c0c0: 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20  tion for p->a[] 
c0d0: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65  is not.  ** nece
c0e0: 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20  ssarily a power 
c0f0: 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49  of two, sqlite3I
c100: 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61  dListAppend() ma
c110: 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a  y not be called.
c120: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c    ** on the dupl
c130: 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79  icate created by
c140: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
c150: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
c160: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
c170: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
c180: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
c190: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
c1a0: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
c1b0: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
c1c0: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
c1d0: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
c1e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
c1f0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
c200: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
c210: 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49  tem->idx = pOldI
c220: 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20  tem->idx;.  }.  
c230: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53  return pNew;.}.S
c240: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
c250: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
c260: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 44 75  *db, Select *pDu
c270: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
c280: 20 53 65 6c 65 63 74 20 2a 70 52 65 74 20 3d 20   Select *pRet = 
c290: 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  0;.  Select *pNe
c2a0: 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74  xt = 0;.  Select
c2b0: 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 20   **pp = &pRet;. 
c2c0: 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61   Select *p;..  a
c2d0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
c2e0: 20 20 66 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b    for(p=pDup; p;
c2f0: 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20   p=p->pPrior){. 
c300: 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 20     Select *pNew 
c310: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c320: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
c330: 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 69 66 28  f(*p) );.    if(
c340: 20 70 4e 65 77 3d 3d 30 20 29 20 62 72 65 61 6b   pNew==0 ) break
c350: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69  ;.    pNew->pELi
c360: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
c370: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
c380: 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20  EList, flags);. 
c390: 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20     pNew->pSrc = 
c3a0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
c3b0: 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66  p(db, p->pSrc, f
c3c0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
c3d0: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
c3e0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
c3f0: 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a  pWhere, flags);.
c400: 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70      pNew->pGroup
c410: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
c420: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
c430: 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b  GroupBy, flags);
c440: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  .    pNew->pHavi
c450: 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
c460: 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  Dup(db, p->pHavi
c470: 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ng, flags);.    
c480: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
c490: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c4a0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
c4b0: 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  rBy, flags);.   
c4c0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f   pNew->op = p->o
c4d0: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65  p;.    pNew->pNe
c4e0: 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20  xt = pNext;.    
c4f0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pNew->pPrior = 0
c500: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  ;.    pNew->pLim
c510: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
c520: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
c530: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
c540: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  New->iLimit = 0;
c550: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  .    pNew->iOffs
c560: 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  et = 0;.    pNew
c570: 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  ->selFlags = p->
c580: 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55  selFlags & ~SF_U
c590: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
c5a0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
c5b0: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
c5c0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
c5d0: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
c5e0: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
c5f0: 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow = p->nSelectR
c600: 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57  ow;.    pNew->pW
c610: 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62  ith = withDup(db
c620: 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 23 69 66  , p->pWith);.#if
c630: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c640: 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20  _WINDOWFUNC.    
c650: 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a  pNew->pWin = 0;.
c660: 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65      pNew->pWinDe
c670: 66 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  fn = sqlite3Wind
c680: 6f 77 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  owListDup(db, p-
c690: 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 23 65 6e 64  >pWinDefn);.#end
c6a0: 69 66 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c  if.    pNew->sel
c6b0: 49 64 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a 20  Id = p->selId;. 
c6c0: 20 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20     *pp = pNew;. 
c6d0: 20 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70     pp = &pNew->p
c6e0: 50 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74  Prior;.    pNext
c6f0: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20   = pNew;.  }..  
c700: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
c710: 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c  else.Select *sql
c720: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
c730: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
c740: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
c750: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
c760: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
c770: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
c780: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
c790: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
c7a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
c7b0: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
c7c0: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
c7d0: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
c7e0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
c7f0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  n list..**.** Th
c800: 65 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74  e pList argument
c810: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
c820: 4e 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65  NULL or a pointe
c830: 72 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74  r to an ExprList
c840: 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  .** obtained fro
c850: 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  m a prior call t
c860: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  o sqlite3ExprLis
c870: 74 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73  tAppend().  This
c880: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20   routine.** may 
c890: 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
c8a0: 20 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74   an ExprList obt
c8b0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
c8c0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e  e3ExprListDup().
c8d0: 0a 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69  .** Reason:  Thi
c8e0: 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65  s routine assume
c8f0: 73 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  s that the numbe
c900: 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c  r of slots in pL
c910: 69 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61  ist->a[].** is a
c920: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20   power of two.  
c930: 54 68 61 74 20 69 73 20 74 72 75 65 20 66 6f 72  That is true for
c940: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c950: 41 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73  Append() returns
c960: 0a 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e  .** but is not n
c970: 65 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20  ecessarily true 
c980: 66 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20  from the return 
c990: 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
c9a0: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a  ExprListDup()..*
c9b0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
c9c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
c9d0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e  r occurs, the en
c9e0: 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65  tire list is fre
c9f0: 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69  ed and.** NULL i
ca00: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
ca10: 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75  non-NULL is retu
ca20: 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  rned, then it is
ca30: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
ca40: 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hat the new entr
ca50: 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  y was successful
ca60: 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  ly appended..*/.
ca70: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
ca80: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
ca90: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
caa0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
cab0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
cac0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
cad0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
cae0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
caf0: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
cb00: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
cb10: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
cb20: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
cb30: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
cb40: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
cb50: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
cb60: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
cb70: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
cb80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
cb90: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
cba0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
cbb0: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
cbc0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
cbd0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
cbe0: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
cbf0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
cc00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
cc10: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
cc20: 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a  ist->nExpr = 0;.
cc30: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69    }else if( (pLi
cc40: 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69  st->nExpr & (pLi
cc50: 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30  st->nExpr-1))==0
cc60: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
cc70: 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77   *pNew;.    pNew
cc80: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
cc90: 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a  loc(db, pList, .
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
ccb0: 65 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70  eof(*pList)+(2*p
ccc0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29  List->nExpr - 1)
ccd0: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
cce0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70  [0]));.    if( p
ccf0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
cd00: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
cd10: 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70   }.    pList = p
cd20: 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  New;.  }.  pItem
cd30: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
cd40: 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20  st->nExpr++];.  
cd50: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66  assert( offsetof
cd60: 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74  (struct ExprList
cd70: 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69  _item,zName)==si
cd80: 7a 65 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70  zeof(pItem->pExp
cd90: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
cda0: 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20  offsetof(struct 
cdb0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45  ExprList_item,pE
cdc0: 78 70 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d  xpr)==0 );.  mem
cdd0: 73 65 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d  set(&pItem->zNam
cde0: 65 2c 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65  e,0,sizeof(*pIte
cdf0: 6d 29 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75  m)-offsetof(stru
ce00: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
ce10: 2c 7a 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65  ,zName));.  pIte
ce20: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
ce30: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
ce40: 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a  ;..no_mem:     .
ce50: 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69    /* Avoid leaki
ce60: 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c  ng memory if mal
ce70: 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20  loc has failed. 
ce80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
ce90: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
cea0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
ceb0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
cec0: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
ced0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c  0;.}../*.** pCol
cee0: 75 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66  umns and pExpr f
cef0: 6f 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73  orm a vector ass
cf00: 69 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73  ignment which is
cf10: 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 54   part of the SET
cf20: 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e  .** clause of an
cf30: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
cf40: 74 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  t.  Like this:.*
cf50: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62  *.**        (a,b
cf60: 2c 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70  ,c) = (expr1,exp
cf70: 72 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a  r2,expr3).** Or:
cf80: 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53      (a,b,c) = (S
cf90: 45 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d  ELECT x,y,z FROM
cfa0: 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72   ....).**.** For
cfb0: 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68   each term of th
cfc0: 65 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d  e vector assignm
cfd0: 65 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20  ent, append new 
cfe0: 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a  entries to the.*
cff0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
d000: 74 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65  t pList.  In the
d010: 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 71 75   case of a subqu
d020: 65 72 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20  ery on the RHS, 
d030: 61 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c  append.** TK_SEL
d040: 45 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65  ECT_COLUMN expre
d050: 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c  ssions..*/.ExprL
d060: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
d070: 4c 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72  ListAppendVector
d080: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d090: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
d0a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d0b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d0c0: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st,       /* Lis
d0d0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
d0e0: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
d0f0: 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  ULL */.  IdList 
d100: 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20  *pColumns,      
d110: 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73  /* List of names
d120: 20 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61   of LHS of the a
d130: 73 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45  ssignment */.  E
d140: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
d150: 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20        /* Vector 
d160: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
d170: 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74   appended. Might
d180: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
d190: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d1a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
d1b0: 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   n;.  int i;.  i
d1c0: 6e 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73  nt iFirst = pLis
d1d0: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
d1e0: 20 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75   : 0;.  /* pColu
d1f0: 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  mns can only be 
d200: 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f  NULL due to an O
d210: 4f 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69  OM but an OOM wi
d220: 6c 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a  ll cause an.  **
d230: 20 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74   exit prior to t
d240: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e  his routine bein
d250: 67 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69  g invoked */.  i
d260: 66 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e  f( NEVER(pColumn
d270: 73 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63  s==0) ) goto vec
d280: 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72  tor_append_error
d290: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
d2a0: 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61   ) goto vector_a
d2b0: 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20  ppend_error;..  
d2c0: 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 69 73  /* If the RHS is
d2d0: 20 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20   a vector, then 
d2e0: 77 65 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65  we can immediate
d2f0: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
d300: 74 68 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73  that .  ** the s
d310: 69 7a 65 20 6f 66 20 74 68 65 20 52 48 53 20 61  ize of the RHS a
d320: 6e 64 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42  nd LHS match.  B
d330: 75 74 20 69 66 20 74 68 65 20 52 48 53 20 69 73  ut if the RHS is
d340: 20 61 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a   a SELECT, .  **
d350: 20 77 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29   wildcards ("*")
d360: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
d370: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
d380: 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
d390: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65  d before.  ** we
d3a0: 20 63 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65   can do the size
d3b0: 20 63 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72   check, so defer
d3c0: 20 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20   the size check 
d3d0: 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72  until code gener
d3e0: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ation..  */.  if
d3f0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
d400: 53 45 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d  SELECT && pColum
d410: 6e 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69  ns->nId!=(n=sqli
d420: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
d430: 65 28 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20  e(pExpr)) ){.   
d440: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d450: 28 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c  (pParse, "%d col
d460: 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64  umns assigned %d
d470: 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20   values",.      
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
d490: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b  olumns->nId, n);
d4a0: 0a 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72  .    goto vector
d4b0: 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20  _append_error;. 
d4c0: 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   }..  for(i=0; i
d4d0: 3c 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20  <pColumns->nId; 
d4e0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
d4f0: 70 53 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74  pSubExpr = sqlit
d500: 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46  e3ExprForVectorF
d510: 69 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78  ield(pParse, pEx
d520: 70 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73  pr, i);.    pLis
d530: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
d540: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
d550: 2c 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70  , pList, pSubExp
d560: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  r);.    if( pLis
d570: 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
d580: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
d590: 3d 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20  =iFirst+i+1 );. 
d5a0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c       pList->a[pL
d5b0: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  ist->nExpr-1].zN
d5c0: 61 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e  ame = pColumns->
d5d0: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
d5e0: 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d    pColumns->a[i]
d5f0: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
d600: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62  }.  }..  if( !db
d610: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
d620: 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
d630: 53 45 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53  SELECT && ALWAYS
d640: 28 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  (pList!=0) ){.  
d650: 20 20 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d    Expr *pFirst =
d660: 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74   pList->a[iFirst
d670: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
d680: 65 72 74 28 20 70 46 69 72 73 74 21 3d 30 20 29  ert( pFirst!=0 )
d690: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
d6a0: 69 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  irst->op==TK_SEL
d6b0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  ECT_COLUMN );.  
d6c0: 20 20 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65     .    /* Store
d6d0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
d6e0: 65 6d 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20  ement in pRight 
d6f0: 73 6f 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65  so it will be de
d700: 6c 65 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a  leted when.    *
d710: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  * sqlite3ExprLis
d720: 74 44 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c  tDelete() is cal
d730: 6c 65 64 20 2a 2f 0a 20 20 20 20 70 46 69 72 73  led */.    pFirs
d740: 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70  t->pRight = pExp
d750: 72 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30  r;.    pExpr = 0
d760: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62  ;..    /* Rememb
d770: 65 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  er the size of t
d780: 68 65 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65  he LHS in iTable
d790: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
d7a0: 63 68 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a  check that.    *
d7b0: 2a 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48  * the RHS and LH
d7c0: 53 20 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75  S sizes match du
d7d0: 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61  ring code genera
d7e0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69  tion. */.    pFi
d7f0: 72 73 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43  rst->iTable = pC
d800: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d  olumns->nId;.  }
d810: 0a 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f  ..vector_append_
d820: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33  error:.  sqlite3
d830: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
d840: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
d850: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
d860: 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65   pColumns);.  re
d870: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
d880: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72  *.** Set the sor
d890: 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  t order for the 
d8a0: 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20  last element on 
d8b0: 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69  the given ExprLi
d8c0: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
d8d0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
d8e0: 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74  rtOrder(ExprList
d8f0: 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72   *p, int iSortOr
d900: 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  der){.  if( p==0
d910: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
d920: 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55  ert( SQLITE_SO_U
d930: 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51  NDEFINED<0 && SQ
d940: 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26  LITE_SO_ASC>=0 &
d950: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  & SQLITE_SO_DESC
d960: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
d970: 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  p->nExpr>0 );.  
d980: 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30  if( iSortOrder<0
d990: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d9a0: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
d9b0: 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  .sortOrder==SQLI
d9c0: 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20  TE_SO_ASC );.   
d9d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
d9e0: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
d9f0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29  sortOrder = (u8)
da00: 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f  iSortOrder;.}../
da10: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
da20: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  rList.a[].zName 
da30: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
da40: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
da50: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
da60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
da70: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
da80: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
da90: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
daa0: 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20  ror.  But pName 
dab0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
dac0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
dad0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
dae0: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
daf0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
db00: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
db10: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
db20: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
db30: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
db40: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
db50: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
db60: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
db70: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
db80: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
db90: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
dba0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
dbb0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
dbc0: 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65   Name to be adde
dbd0: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  d */.  int dequo
dbe0: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
dbf0: 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20  * True to cause 
dc00: 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64  the name to be d
dc10: 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  equoted */.){.  
dc20: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
dc30: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
dc40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
dc50: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
dc60: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
dc70: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
dc80: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
dc90: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
dca0: 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c  .    pItem = &pL
dcb0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
dcc0: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
dcd0: 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  rt( pItem->zName
dce0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
dcf0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
dd00: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
dd10: 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  e->db, pName->z,
dd20: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
dd30: 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71  if( dequote ) sq
dd40: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74  lite3Dequote(pIt
dd50: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
dd60: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
dd70: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53   ExprList.a[].zS
dd80: 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  pan element of t
dd90: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
dda0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
ddb0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
ddc0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
ddd0: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
dde0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
ddf0: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53  M error.  But pS
de00: 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  pan should never
de10: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
de20: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
de30: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
de40: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
de50: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
de60: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
de70: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
de80: 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65  SetSpan(.  Parse
de90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
dea0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
deb0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
dec0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
ded0: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
dee0: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
def0: 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  pan. */.  const 
df00: 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20  char *zStart,   
df10: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68    /* Start of th
df20: 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73  e span */.  cons
df30: 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20  t char *zEnd    
df40: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
df50: 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73  e span */.){.  s
df60: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
df70: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
df80: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64  t( pList!=0 || d
df90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
dfa0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
dfb0: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
dfc0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
dfd0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
dfe0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
dff0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
e000: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
e010: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e020: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
e030: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
e040: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
e050: 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74  bSpanDup(db, zSt
e060: 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a  art, zEnd);.  }.
e070: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
e080: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e090: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
e0a0: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
e0b0: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
e0c0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
e0d0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
e0e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
e0f0: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
e100: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
e110: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
e120: 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  *pEList,.  const
e130: 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29   char *zObject.)
e140: 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61  {.  int mx = pPa
e150: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
e160: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
e170: 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  UMN];.  testcase
e180: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
e190: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b  st->nExpr==mx );
e1a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
e1b0: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
e1c0: 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20  Expr==mx+1 );.  
e1d0: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
e1e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29  List->nExpr>mx )
e1f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e200: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
e210: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
e220: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
e230: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
e240: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
e250: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
e260: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
e270: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
e280: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
e290: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
e2a0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
e2b0: 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
e2c0: 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74  >nExpr;.  struct
e2d0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
e2e0: 70 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e  pItem =  pList->
e2f0: 61 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  a;.  assert( pLi
e300: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
e310: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
e320: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
e330: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
e340: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e350: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
e360: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e370: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
e380: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
e390: 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d  m++;.  }while( -
e3a0: 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  -i>0 );.  sqlite
e3b0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c  3DbFreeNN(db, pL
e3c0: 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ist);.}.void sql
e3d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
e3e0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
e3f0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e400: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20  {.  if( pList ) 
e410: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
e420: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
e430: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
e440: 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61   bitwise-OR of a
e450: 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69  ll Expr.flags fi
e460: 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65  elds in the give
e470: 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a  n.** ExprList..*
e480: 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70  /.u32 sqlite3Exp
e490: 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74  rListFlags(const
e4a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e4b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33  ){.  int i;.  u3
e4c0: 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  2 m = 0;.  asser
e4d0: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
e4e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
e4f0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
e500: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
e510: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
e520: 45 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72  Expr;.     asser
e530: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
e540: 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e      m |= pExpr->
e550: 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74  flags;.  }.  ret
e560: 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn m;.}../*.** 
e570: 54 68 69 73 20 69 73 20 61 20 53 45 4c 45 43 54  This is a SELECT
e580: 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66  -node callback f
e590: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
e5a0: 6e 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a  n walker that.**
e5b0: 20 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e   always "fails".
e5c0: 20 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74    By "fail" in t
e5d0: 68 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61  his case, we mea
e5e0: 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72  n set.** pWalker
e5f0: 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20  ->eCode to zero 
e600: 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a  and abort..**.**
e610: 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69   This callback i
e620: 73 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70  s used by multip
e630: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61  le expression wa
e640: 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lkers..*/.int sq
e650: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
e660: 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ail(Walker *pWal
e670: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
e680: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
e690: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
e6a0: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65  d);.  pWalker->e
e6b0: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Code = 0;.  retu
e6c0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a  rn WRC_Abort;.}.
e6d0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
e6e0: 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  put expression i
e6f0: 73 20 61 6e 20 49 44 20 77 69 74 68 20 74 68 65  s an ID with the
e700: 20 6e 61 6d 65 20 22 74 72 75 65 22 20 6f 72 20   name "true" or 
e710: 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20  "false".** then 
e720: 63 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20  convert it into 
e730: 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20  an TK_TRUEFALSE 
e740: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 6e 6f  term.  Return no
e750: 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74 68 65  n-zero if.** the
e760: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61 70 70   conversion happ
e770: 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f 20 69  ened, and zero i
e780: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e790: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 0a 2a   is unaltered..*
e7a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e7b0: 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 45  rIdToTrueFalse(E
e7c0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61  xpr *pExpr){.  a
e7d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e7e0: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78 70 72  ==TK_ID || pExpr
e7f0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
e800: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
e810: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
e820: 2e 7a 54 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29  .zToken, "true")
e830: 3d 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65  ==0.   || sqlite
e840: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
e850: 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65  u.zToken, "false
e860: 22 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  ")==0.  ){.    p
e870: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52  Expr->op = TK_TR
e880: 55 45 46 41 4c 53 45 3b 0a 20 20 20 20 72 65 74  UEFALSE;.    ret
e890: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
e8a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
e8b0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  The argument mus
e8c0: 74 20 62 65 20 61 20 54 4b 5f 54 52 55 45 46 41  t be a TK_TRUEFA
e8d0: 4c 53 45 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  LSE Expr node.  
e8e0: 52 65 74 75 72 6e 20 31 20 69 66 20 69 74 20 69  Return 1 if it i
e8f0: 73 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20  s TRUE.** and 0 
e900: 69 66 20 69 74 20 69 73 20 46 41 4c 53 45 2e 0a  if it is FALSE..
e910: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
e920: 70 72 54 72 75 74 68 56 61 6c 75 65 28 63 6f 6e  prTruthValue(con
e930: 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  st Expr *pExpr){
e940: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e950: 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c  ->op==TK_TRUEFAL
e960: 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SE );.  assert( 
e970: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
e980: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
e990: 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 20  true")==0.      
e9a0: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
e9b0: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
e9c0: 65 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30 20 29  en,"false")==0 )
e9d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  ;.  return pExpr
e9e0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30  ->u.zToken[4]==0
e9f0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  ;.}.../*.** Thes
ea00: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
ea10: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  alker callbacks 
ea20: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78  used to check ex
ea30: 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20  pressions to.** 
ea40: 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20  see if they are 
ea50: 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73  "constant" for s
ea60: 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ome definition o
ea70: 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65  f constant.  The
ea80: 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  .** Walker.eCode
ea90: 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65   value determine
eaa0: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63  s the type of "c
eab0: 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20  onstant" we are 
eac0: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a  looking.** for..
ead0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
eae0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
eaf0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
eb00: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
eb10: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
eb20: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
eb30: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
eb40: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
eb50: 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73  Code==1.**     s
eb60: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
eb70: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20  tantNotJoin()   
eb80: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
eb90: 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20  >eCode==2.**    
eba0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
ebb0: 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  bleConstant()   
ebc0: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
ebd0: 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20  r->eCode==3.**  
ebe0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
ebf0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
ec00: 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c  on()        pWal
ec10: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
ec20: 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20   5.**.** In all 
ec30: 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62  cases, the callb
ec40: 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e  acks set Walker.
ec50: 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72  eCode=0 and abor
ec60: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
ec70: 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20  ion.** is found 
ec80: 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73  to not be a cons
ec90: 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tant..**.** The 
eca0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
ecb0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
ecc0: 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76  ) is used for ev
ecd0: 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73  aluating express
ece0: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45  ions.** in a CRE
ecf0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
ed00: 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72  ent.  The Walker
ed10: 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20  .eCode value is 
ed20: 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a  5 when parsing.*
ed30: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63  * an existing sc
ed40: 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20  hema and 4 when 
ed50: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77  processing a new
ed60: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62   statement.  A b
ed70: 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
ed80: 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f  r raises an erro
ed90: 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d  r for new statem
eda0: 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c  ents, but is sil
edb0: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a  ently converted.
edc0: 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65  ** to NULL for e
edd0: 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e  xisting schemas.
ede0: 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71    This allows sq
edf0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
ee00: 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74  es that .** cont
ee10: 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61  ain a bound para
ee20: 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68  meter because th
ee30: 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65  ey were generate
ee40: 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
ee50: 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
ee60: 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79   to be parsed by
ee70: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
ee80: 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75  of SQLite withou
ee90: 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d  t raising a.** m
eea0: 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20  alformed schema 
eeb0: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
eec0: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
eed0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
eee0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
eef0: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
ef00: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69  pWalker->eCode i
ef10: 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 2 then any ter
ef20: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
ef30: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
ef40: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
ef50: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
ef60: 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
ef70: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
ef80: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
ef90: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
efa0: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
efb0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65   */.  if( pWalke
efc0: 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45  r->eCode==2 && E
efd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
efe0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
eff0: 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  n) ){.    pWalke
f000: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
f010: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
f020: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
f030: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
f040: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
f050: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
f060: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
f070: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
f080: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
f090: 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70   ** and either p
f0a0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
f0b0: 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e   or 5 or the fun
f0c0: 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20  ction has the.  
f0d0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43    ** SQLITE_FUNC
f0e0: 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a  _CONST flag. */.
f0f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
f100: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
f110: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d  pWalker->eCode>=
f120: 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  4 || ExprHasProp
f130: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f  erty(pExpr,EP_Co
f140: 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  nstFunc) ){.    
f150: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
f160: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
f170: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
f180: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
f190: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
f1a0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
f1b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f1c0: 49 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ID:.      /* Con
f1d0: 76 65 72 74 20 22 74 72 75 65 22 20 6f 72 20 22  vert "true" or "
f1e0: 66 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46 41  false" in a DEFA
f1f0: 55 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  ULT clause into 
f200: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70 70  the.      ** app
f210: 72 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55 45  ropriate TK_TRUE
f220: 46 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20 2a  FALSE operator *
f230: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
f240: 74 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46  te3ExprIdToTrueF
f250: 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
f260: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
f270: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
f280: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
f290: 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  hru */.    case 
f2a0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
f2b0: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
f2c0: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
f2d0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
f2e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
f2f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
f300: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f310: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
f320: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
f330: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
f340: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
f350: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
f360: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
f370: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
f380: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
f390: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
f3a0: 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  pr, EP_FixedCol)
f3b0: 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f   && pWalker->eCo
f3c0: 64 65 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 20  de!=2 ){.       
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 20 20 20 20 7d 0a 20 20  inue;.      }.  
f3f0: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
f400: 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78  >eCode==3 && pEx
f410: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c  pr->iTable==pWal
f420: 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20  ker->u.iCur ){. 
f430: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
f440: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
f450: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
f460: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
f470: 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c   case TK_IF_NULL
f480: 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 54  _ROW:.    case T
f490: 4b 5f 52 45 47 49 53 54 45 52 3a 0a 20 20 20 20  K_REGISTER:.    
f4a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
f4b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
f4c0: 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ER );.      test
f4d0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f4e0: 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20  =TK_IF_NULL_ROW 
f4f0: 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72  );.      pWalker
f500: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
f510: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
f520: 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  ort;.    case TK
f530: 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20  _VARIABLE:.     
f540: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
f550: 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20  ode==5 ){.      
f560: 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f    /* Silently co
f570: 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61  nvert bound para
f580: 6d 65 74 65 72 73 20 74 68 61 74 20 61 70 70 65  meters that appe
f590: 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45  ar inside of CRE
f5a0: 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ATE.        ** s
f5b0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61  tatements into a
f5c0: 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69   NULL when parsi
f5d0: 6e 67 20 74 68 65 20 43 52 45 41 54 45 20 73 74  ng the CREATE st
f5e0: 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74  atement text out
f5f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
f600: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
f610: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
f620: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
f630: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c  _NULL;.      }el
f640: 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  se if( pWalker->
f650: 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20  eCode==4 ){.    
f660: 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70      /* A bound p
f670: 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52  arameter in a CR
f680: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  EATE statement t
f690: 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66  hat originates f
f6a0: 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  rom.        ** s
f6b0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
f6c0: 20 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72   causes an error
f6d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c   */.        pWal
f6e0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
f6f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
f700: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
f710: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  }.      /* Fall 
f720: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64  through */.    d
f730: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65  efault:.      te
f740: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
f750: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20  p==TK_SELECT ); 
f760: 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  /* sqlite3Select
f770: 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61 6c  WalkFail() disal
f780: 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 74 65  lows */.      te
f790: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
f7a0: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20  p==TK_EXISTS ); 
f7b0: 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  /* sqlite3Select
f7c0: 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61 6c  WalkFail() disal
f7d0: 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 72 65  lows */.      re
f7e0: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
f7f0: 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  e;.  }.}.static 
f800: 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28  int exprIsConst(
f810: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69  Expr *p, int ini
f820: 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29  tFlag, int iCur)
f830: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
f840: 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c  w.eCode = initFl
f850: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
f860: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
f870: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
f880: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
f890: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  = sqlite3SelectW
f8a0: 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20  alkFail;.#ifdef 
f8b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77  SQLITE_DEBUG.  w
f8c0: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
f8d0: 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  2 = sqlite3Selec
f8e0: 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65  tWalkAssert2;.#e
f8f0: 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75 72 20  ndif.  w.u.iCur 
f900: 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65  = iCur;.  sqlite
f910: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
f920: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
f930: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  de;.}../*.** Wal
f940: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
f950: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
f960: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
f970: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
f980: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
f990: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
f9a0: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
f9b0: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
f9c0: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
f9d0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
f9e0: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
f9f0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
fa00: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
fa10: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
fa20: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
fa30: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
fa40: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
fa50: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
fa60: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
fa70: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
fa80: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
fa90: 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b  sConst(p, 1, 0);
faa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
fab0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
fac0: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
fad0: 65 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20 20 28  ero if.**.**   (
fae0: 31 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  1) the expressio
faf0: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 61  n is constant, a
fb00: 6e 64 0a 2a 2a 20 20 20 28 32 29 20 74 68 65 20  nd.**   (2) the 
fb10: 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
fb20: 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
fb30: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
fb40: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  use.**       of 
fb50: 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64  a LEFT JOIN, and
fb60: 0a 2a 2a 20 20 20 28 33 29 20 74 68 65 20 65 78  .**   (3) the ex
fb70: 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
fb80: 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 45 50  t contain any EP
fb90: 5f 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43 4f 4c  _FixedCol TK_COL
fba0: 55 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f 70 65  UMN.**       ope
fbb0: 72 61 6e 64 73 20 63 72 65 61 74 65 64 20 62 79  rands created by
fbc0: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 70 72   the constant pr
fbd0: 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69  opagation optimi
fbe0: 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  zation..**.** Wh
fbf0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
fc00: 72 65 74 75 72 6e 73 20 74 72 75 65 2c 20 69 74  returns true, it
fc10: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
fc20: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
fc30: 2a 20 63 61 6e 20 62 65 20 61 64 64 65 64 20 74  * can be added t
fc40: 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 43  o the pParse->pC
fc50: 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 20 61 6e  onstExpr list an
fc60: 64 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  d evaluated once
fc70: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 72 65   when.** the pre
fc80: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
fc90: 73 74 61 72 74 73 20 75 70 2e 20 20 53 65 65 20  starts up.  See 
fca0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
fcb0: 74 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20  tInit()..*/.int 
fcc0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
fcd0: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70  stantNotJoin(Exp
fce0: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
fcf0: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32  exprIsConst(p, 2
fd00: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 0);.}../*.** W
fd10: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
fd20: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
fd30: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
fd40: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
fd50: 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e  nstant.** for an
fd60: 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  y single row of 
fd70: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63  the table with c
fd80: 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20  ursor iCur.  In 
fd90: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
fda0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  .** expression m
fdb0: 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f  ust not refer to
fdc0: 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69   any non-determi
fdd0: 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20  nistic function 
fde0: 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65  nor any.** table
fdf0: 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72   other than iCur
fe00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fe10: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
fe20: 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ant(Expr *p, int
fe30: 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e   iCur){.  return
fe40: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
fe50: 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a  3, iCur);.}.../*
fe60: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  .** sqlite3WalkE
fe70: 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75  xpr() callback u
fe80: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78  sed by sqlite3Ex
fe90: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  prIsConstantOrGr
fea0: 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61 74  oupBy()..*/.stat
feb0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
fec0: 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
fed0: 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  By(Walker *pWalk
fee0: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
fef0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  {.  ExprList *pG
ff00: 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65 72  roupBy = pWalker
ff10: 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20 20  ->u.pGroupBy;.  
ff20: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68 65  int i;..  /* Che
ff30: 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 69  ck if pExpr is i
ff40: 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79 20  dentical to any 
ff50: 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20 49  GROUP BY term. I
ff60: 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a 20  f so, consider. 
ff70: 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74 2e   ** it constant.
ff80: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
ff90: 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
ffa0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
ffb0: 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79 2d  r *p = pGroupBy-
ffc0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
ffd0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
ffe0: 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72  Compare(0, pExpr
fff0: 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20  , p, -1)<2 ){.  
10000 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
10010 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
10020 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b 65  NNCollSeq(pWalke
10030 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  r->pParse, p);. 
10040 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
10050 49 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c 29 20  IsBinary(pColl) 
10060 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
10070 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
10080 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
10090 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45    /* Check if pE
100a0 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c  xpr is a sub-sel
100b0 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73  ect. If so, cons
100c0 69 64 65 72 20 69 74 20 76 61 72 69 61 62 6c 65  ider it variable
100d0 2e 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48  . */.  if( ExprH
100e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
100f0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
10100 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
10110 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72  eCode = 0;.    r
10120 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
10130 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65  .  }..  return e
10140 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
10150 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72  t(pWalker, pExpr
10160 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
10170 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10180 74 72 65 65 20 70 61 73 73 65 64 20 61 73 20 74  tree passed as t
10190 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
101a0 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  t. Return non-ze
101b0 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70  ro.** if the exp
101c0 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73  ression consists
101d0 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e   entirely of con
101e0 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69 65 73  stants or copies
101f0 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e   of terms .** in
10200 20 70 47 72 6f 75 70 42 79 20 74 68 61 74 20 73   pGroupBy that s
10210 6f 72 74 20 77 69 74 68 20 74 68 65 20 42 49 4e  ort with the BIN
10220 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ARY collation se
10230 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
10240 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
10250 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
10260 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  if a term of the
10270 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 63   HAVING clause c
10280 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65  an.** be promote
10290 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45 52 45  d into the WHERE
102a0 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64   clause.  In ord
102b0 65 72 20 66 6f 72 20 73 75 63 68 20 61 20 70 72  er for such a pr
102c0 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c  omotion to work,
102d0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
102e0 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
102f0 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  se term must be 
10300 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c  the same for all
10310 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61   members of.** a
10320 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65 20 72   "group".  The r
10330 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20  equirement that 
10340 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
10350 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41 52 59  m must be BINARY
10360 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 61 74  .** assumes that
10370 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74   no other collat
10380 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c  ing sequence wil
10390 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72 2d 67  l have a finer-g
103a0 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69  rained.** groupi
103b0 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79 2e 20  ng than binary. 
103c0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20   In other words 
103d0 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e  (A=B COLLATE bin
103e0 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  ary) implies.** 
103f0 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f 74 68  A=B in every oth
10400 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  er collating seq
10410 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65 71 75  uence.  The requ
10420 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  irement that the
10430 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62 65 20  .** GROUP BY be 
10440 42 49 4e 41 52 59 20 69 73 20 73 74 72 69 63 74  BINARY is strict
10450 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  er than necessar
10460 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61 6c 73  y.  It would als
10470 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f  o work.** to pro
10480 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c 61 75  mote HAVING clau
10490 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
104a0 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74 69 76   same alternativ
104b0 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  e collating.** s
104c0 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20 47  equence as the G
104d0 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20 62 75  ROUP BY term, bu
104e0 74 20 74 68 61 74 20 69 73 20 6d 75 63 68 20 68  t that is much h
104f0 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a  arder to check,.
10500 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  ** alternative c
10510 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10520 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c  es are uncommon,
10530 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f 6e 6c   and this is onl
10540 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  y an.** optimiza
10550 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65  tion, so we take
10560 20 74 68 65 20 65 61 73 79 20 77 61 79 20 6f 75   the easy way ou
10570 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72 65 71  t and simply req
10580 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55  uire the.** GROU
10590 50 20 42 59 20 74 6f 20 75 73 65 20 74 68 65 20  P BY to use the 
105a0 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67  BINARY collating
105b0 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e   sequence..*/.in
105c0 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
105d0 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79  onstantOrGroupBy
105e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
105f0 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c 69 73  Expr *p, ExprLis
10600 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20 20  t *pGroupBy){.  
10610 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43  Walker w;.  w.eC
10620 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78  ode = 1;.  w.xEx
10630 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
10640 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f  rNodeIsConstantO
10650 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78 53  rGroupBy;.  w.xS
10660 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
10670 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70 42  0;.  w.u.pGroupB
10680 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
10690 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
106a0 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
106b0 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
106c0 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
106d0 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
106e0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
106f0 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
10700 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
10710 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
10720 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
10730 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
10740 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
10750 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
10760 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
10770 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
10780 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
10790 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
107a0 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
107b0 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
107c0 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
107d0 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
107e0 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
107f0 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
10800 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
10810 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
10820 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10830 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
10840 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38 20  ion(Expr *p, u8 
10850 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65 72  isInit){.  asser
10860 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t( isInit==0 || 
10870 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72  isInit==1 );.  r
10880 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
10890 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30  t(p, 4+isInit, 0
108a0 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
108b0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
108c0 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61  R_HINTS./*.** Wa
108d0 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
108e0 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
108f0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
10900 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  on contains a.**
10910 20 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f 6d   subquery of som
10920 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e 20  e kind.  Return 
10930 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  0 if there are n
10940 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f  o subqueries..*/
10950 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
10960 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79  ContainsSubquery
10970 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c  (Expr *p){.  Wal
10980 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65  ker w;.  w.eCode
10990 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43   = 1;.  w.xExprC
109a0 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
109b0 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
109c0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
109d0 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ck = sqlite3Sele
109e0 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64  ctWalkFail;.#ifd
109f0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
10a00 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
10a10 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65  ack2 = sqlite3Se
10a20 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b  lectWalkAssert2;
10a30 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
10a40 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
10a50 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
10a60 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  de==0;.}.#endif.
10a70 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
10a80 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
10a90 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
10aa0 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
10ab0 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
10ac0 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
10ad0 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
10ae0 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
10af0 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
10b00 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
10b10 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
10b20 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
10b30 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
10b40 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
10b50 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
10b60 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
10b70 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
10b80 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
10b90 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
10ba0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
10bb0 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
10bc0 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  pValue){.  int r
10bd0 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d  c = 0;.  if( p==
10be0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
10bf0 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  * Can only happe
10c00 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f  n following on O
10c10 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61  OM */..  /* If a
10c20 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
10c30 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72  an integer liter
10c40 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e 20  al that fits in 
10c50 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a  a signed 32-bit.
10c60 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68    ** integer, th
10c70 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  en the EP_IntVal
10c80 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76  ue flag will hav
10c90 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
10ca0 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  et */.  assert( 
10cb0 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  p->op!=TK_INTEGE
10cc0 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26  R || (p->flags &
10cd0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30   EP_IntValue)!=0
10ce0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
10cf0 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
10d00 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29  ->u.zToken, &rc)
10d10 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ==0 );..  if( p-
10d20 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
10d30 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61  alue ){.    *pVa
10d40 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75  lue = p->u.iValu
10d50 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e;.    return 1;
10d60 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
10d70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
10d80 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
10d90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45     rc = sqlite3E
10da0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
10db0 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a  pLeft, pValue);.
10dc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10dd0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
10de0 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
10df0 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  nt v;.      if( 
10e00 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
10e10 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  eger(p->pLeft, &
10e20 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  v) ){.        as
10e30 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34  sert( v!=(-21474
10e40 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20  83647-1) );.    
10e50 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
10e60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
10e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10e80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10e90 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
10ea0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10eb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
10ec0 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65  n FALSE if there
10ed0 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
10ee0 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
10ef0 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a  n can be NULL..*
10f00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
10f10 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20  ession might be 
10f20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65  NULL or if the e
10f30 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f  xpression is too
10f40 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74   complex.** to t
10f50 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e  ell return TRUE.
10f60 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
10f70 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73  utine is used as
10f80 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
10f90 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e  , to skip OP_IsN
10fa0 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77  ull opcodes.** w
10fb0 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  hen we know that
10fc0 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
10fd0 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  be NULL.  Hence,
10fe0 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
10ff0 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  e.** (returning 
11000 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63  TRUE when in fac
11010 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
11020 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55   can never be NU
11030 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  LL) might.** be 
11040 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61  a small performa
11050 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f  nce hit but is o
11060 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73  therwise harmles
11070 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  s.  On the other
11080 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73  .** hand, a fals
11090 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75  e negative (retu
110a0 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e  rning FALSE when
110b0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c   the result coul
110c0 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69  d be NULL).** wi
110d0 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
110e0 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74   in an incorrect
110f0 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65   answer.  So whe
11100 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
11110 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69  rn.** TRUE..*/.i
11120 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  nt sqlite3ExprCa
11130 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78  nBeNull(const Ex
11140 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b  pr *p){.  u8 op;
11150 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
11160 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
11170 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
11180 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
11190 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
111a0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
111b0 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
111c0 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
111d0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
111e0 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
111f0 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
11200 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
11210 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
11220 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
11230 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
11240 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 72 65 74 75  LUMN:.      retu
11250 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
11260 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75  ty(p, EP_CanBeNu
11270 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ll) ||.         
11280 20 20 20 20 70 2d 3e 70 54 61 62 3d 3d 30 20 7c      p->pTab==0 |
11290 7c 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20  |  /* Reference 
112a0 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  to column of ind
112b0 65 78 20 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  ex on expression
112c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
112d0 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20   (p->iColumn>=0 
112e0 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  && p->pTab->aCol
112f0 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  [p->iColumn].not
11300 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65  Null==0);.    de
11310 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
11320 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
11330 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
11340 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
11350 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e  ression is a con
11360 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c  stant which woul
11370 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  d be.** unchange
11380 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79  d by OP_Affinity
11390 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69   with the affini
113a0 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ty given in the 
113b0 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
113c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
113d0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
113e0 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
113f0 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
11400 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  peration.** can 
11410 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65  be omitted.  Whe
11420 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72  n in doubt retur
11430 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73  n FALSE.  A fals
11440 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73  e negative.** is
11450 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61   harmless.  A fa
11460 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f  lse positive, ho
11470 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c  wever, can resul
11480 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a  t in the wrong.*
11490 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74  * answer..*/.int
114a0 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
114b0 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
114c0 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c  e(const Expr *p,
114d0 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38   char aff){.  u8
114e0 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d   op;.  if( aff==
114f0 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
11500 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68  ) return 1;.  wh
11510 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
11520 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  PLUS || p->op==T
11530 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20  K_UMINUS ){ p = 
11540 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70  p->pLeft; }.  op
11550 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
11560 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
11570 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
11580 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
11590 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
115a0 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
115b0 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
115c0 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
115d0 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
115e0 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
115f0 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
11600 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11610 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
11620 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  EAL || aff==SQLI
11630 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
11640 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11650 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
11660 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
11670 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
11680 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11690 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72  _BLOB: {.      r
116a0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
116b0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
116c0 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  N: {.      asser
116d0 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20  t( p->iTable>=0 
116e0 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20  );  /* p cannot 
116f0 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45  be part of a CHE
11700 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  CK constraint */
11710 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
11720 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20  >iColumn<0.     
11730 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
11740 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
11750 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
11760 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  AFF_NUMERIC);.  
11770 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
11780 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
11790 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
117a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
117b0 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
117c0 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
117d0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
117e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
117f0 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
11800 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
11810 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
11820 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
11830 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
11840 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
11850 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
11860 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
11870 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
11880 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
11890 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
118a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20  .}../*.** pX is 
118b0 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e  the RHS of an IN
118c0 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 70   operator.  If p
118d0 58 20 69 73 20 61 20 53 45 4c 45 43 54 20 73 74  X is a SELECT st
118e0 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  atement .** that
118f0 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66 69   can be simplifi
11900 65 64 20 74 6f 20 61 20 64 69 72 65 63 74 20 74  ed to a direct t
11910 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68 65  able access, the
11920 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  n return.** a po
11930 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45 4c  inter to the SEL
11940 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
11950 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20 53  If pX is not a S
11960 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
11970 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53 45  .** or if the SE
11980 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6e  LECT statement n
11990 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69 66  eeds to be manif
119a0 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ested into a tra
119b0 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c  nsient.** table,
119c0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c   then return NUL
119d0 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  L..*/.#ifndef SQ
119e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
119f0 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74  RY.static Select
11a00 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72   *isCandidateFor
11a10 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29 7b  InOpt(Expr *pX){
11a20 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
11a30 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
11a40 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
11a50 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
11a60 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
11a70 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
11a80 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
11a90 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ct) ) return 0; 
11aa0 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71 75 65   /* Not a subque
11ab0 72 79 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72  ry */.  if( Expr
11ac0 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
11ad0 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 20 29  EP_VarSelect)  )
11ae0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
11af0 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 20 2a  orrelated subq *
11b00 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53  /.  p = pX->x.pS
11b10 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e  elect;.  if( p->
11b20 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
11b30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11b40 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  /* Not a compoun
11b50 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  d SELECT */.  if
11b60 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
11b70 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
11b80 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
11b90 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
11ba0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
11bb0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
11bc0 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
11bd0 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  nct );.    testc
11be0 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
11bf0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
11c00 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
11c10 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
11c20 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
11c30 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65  * No DISTINCT ke
11c40 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67  yword and no agg
11c50 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
11c60 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
11c70 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
11c80 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
11c90 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50   /* Has no GROUP
11ca0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
11cb0 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20  if( p->pLimit ) 
11cc0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
11cd0 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
11ce0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
11cf0 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
11d00 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
11d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
11d20 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
11d30 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   */.  pSrc = p->
11d40 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
11d50 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
11d60 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
11d70 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
11d80 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65      /* Single te
11d90 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  rm in FROM claus
11da0 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  e */.  if( pSrc-
11db0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20  >a[0].pSelect ) 
11dc0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
11dd0 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73   FROM is not a s
11de0 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20  ubquery or view 
11df0 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
11e00 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61  ->a[0].pTab;.  a
11e10 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
11e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
11e30 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
11e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
11e50 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
11e60 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
11e70 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
11e80 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
11e90 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
11ea0 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
11eb0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
11ec0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
11ed0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
11ee0 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20  !=0 );.  /* All 
11ef0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d  SELECT results m
11f00 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20  ust be columns. 
11f10 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
11f20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
11f30 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
11f40 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Res = pEList->a[
11f50 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
11f60 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43  ( pRes->op!=TK_C
11f70 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
11f80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
11f90 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  es->iTable==pSrc
11fa0 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[0].iCursor )
11fb0 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72  ;  /* Not a corr
11fc0 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20  elated subquery 
11fd0 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
11fe0 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  p;.}.#endif /* S
11ff0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
12000 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
12010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12020 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
12030 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68  ate code that ch
12040 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ecks the left-mo
12050 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  st column of ind
12060 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f  ex table iCur to
12070 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f   see if.** it co
12080 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
12090 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20  entries.  Cause 
120a0 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20  the register at 
120b0 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65  regHasNull to be
120c0 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e   set.** to a non
120d0 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69  -NULL value if i
120e0 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  Cur contains no 
120f0 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65  NULLs.  Cause re
12100 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c  gister regHasNul
12110 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74  l.** to be set t
12120 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63  o NULL if iCur c
12130 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
12140 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
12150 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12160 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
12170 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69  lFlag(Vdbe *v, i
12180 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67  nt iCur, int reg
12190 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20  HasNull){.  int 
121a0 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33  addr1;.  sqlite3
121b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
121c0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
121d0 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  HasNull);.  addr
121e0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
121f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
12200 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43  nd, iCur); VdbeC
12210 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
12220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12230 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43  v, OP_Column, iC
12240 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  ur, 0, regHasNul
12250 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
12260 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
12270 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
12280 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
12290 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69  , "first_entry_i
122a0 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a  n(%d)", iCur));.
122b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
122c0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
122d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
122e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
122f0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
12300 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
12310 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
12320 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  th a list (not a
12330 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68   subquery) on th
12340 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
12350 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54   side.  Return T
12360 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74  RUE if that list
12370 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f   is constant..*/
12380 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
12390 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
123a0 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  nt(Expr *pIn){. 
123b0 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69   Expr *pLHS;.  i
123c0 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
123d0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
123e0 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65  ty(pIn, EP_xIsSe
123f0 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20  lect) );.  pLHS 
12400 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
12410 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
12420 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
12430 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
12440 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
12450 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
12460 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
12470 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12480 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
12490 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
124a0 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
124b0 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
124c0 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
124d0 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
124e0 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
124f0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
12500 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
12510 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
12520 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
12530 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
12540 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
12550 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12560 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
12570 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
12580 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
12590 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
125a0 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
125b0 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
125c0 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
125d0 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
125e0 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
125f0 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
12600 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
12610 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
12620 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
12630 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
12640 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
12650 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
12660 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
12670 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
12680 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
12690 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
126a0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
126b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
126c0 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
126d0 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
126e0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
126f0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
12700 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
12710 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
12720 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
12730 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
12740 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
12750 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
12760 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
12770 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
12780 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
12790 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
127a0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
127b0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
127c0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
127d0 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
127e0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
127f0 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
12800 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
12810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12820 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
12830 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
12840 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
12850 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
12860 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
12870 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
12880 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
128b0 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
128c0 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
128d0 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
128e0 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
128f0 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
12900 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
12910 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
12920 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
12930 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
12940 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20  LECT <column1>, 
12950 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f  <column2>... FRO
12960 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
12970 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
12980 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
12990 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72   a list or a mor
129a0 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65  e complex subque
129b0 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65  ry, then.** an e
129c0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d  phemeral table m
129d0 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
129e0 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
129f0 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a  he RHS and then.
12a00 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61  ** pX->iTable ma
12a10 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
12a20 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
12a30 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  le instead of an
12a40 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62  .** existing tab
12a50 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  le..**.** The in
12a60 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
12a70 6d 75 73 74 20 63 6f 6e 74 61 69 6e 2c 20 61 74  must contain, at
12a80 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20   a minimum, one 
12a90 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49  of the bits.** I
12aa0 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
12ab0 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c  IP or IN_INDEX_L
12ac0 4f 4f 50 20 62 75 74 20 6e 6f 74 20 62 6f 74 68  OOP but not both
12ad0 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f  .  If inFlags co
12ae0 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44  ntains.** IN_IND
12af0 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74  EX_MEMBERSHIP, t
12b00 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65  hen the generate
12b10 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  d table will be 
12b20 75 73 65 64 20 66 6f 72 20 61 20 66 61 73 74 0a  used for a fast.
12b30 2a 2a 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  ** membership te
12b40 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e  st.  When the IN
12b50 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20  _INDEX_LOOP bit 
12b60 69 73 20 73 65 74 2c 20 74 68 65 20 49 4e 20 69  is set, the IN i
12b70 6e 64 65 78 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  ndex will.** be 
12b80 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65  used to loop ove
12b90 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
12ba0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12bb0 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
12bc0 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
12bd0 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e  LOOP is used (an
12be0 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
12bf0 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
12c00 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
12c10 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29  the set members)
12c20 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   then the b-tree
12c30 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69   must not contai
12c40 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  n duplicates..**
12c50 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   An epheremal ta
12c60 62 6c 65 20 77 69 6c 6c 20 62 65 20 63 72 65 61  ble will be crea
12c70 74 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  ted unless the s
12c80 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20  elected columns 
12c90 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a  are guaranteed.*
12ca0 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
12cb0 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
12cc0 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
12cd0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
12ce0 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51  due to.** a UNIQ
12cf0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
12d00 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68   index..**.** Wh
12d10 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  en IN_INDEX_MEMB
12d20 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20 28  ERSHIP is used (
12d30 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
12d40 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  ill be used .** 
12d50 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d  for fast set mem
12d60 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20 74  bership tests) t
12d70 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  hen an epheremal
12d80 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
12d90 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
12da0 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69  columns> is a si
12db0 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49  ngle INTEGER PRI
12dc0 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
12dd0 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20  or an .** index 
12de0 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74  can be found wit
12df0 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
12e00 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73  <columns> as its
12e10 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a   left-most..**.*
12e20 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45  * If the IN_INDE
12e30 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e  X_NOOP_OK and IN
12e40 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
12e50 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61  P are both set a
12e60 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53  nd.** if the RHS
12e70 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12e80 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e  tor is a list (n
12e90 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74  ot a subquery) t
12ea0 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
12eb0 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65  ine might decide
12ec0 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61   that creating a
12ed0 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72  n ephemeral b-tr
12ee0 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ee for membershi
12ef0 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20  p.** testing is 
12f00 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e  too expensive an
12f10 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  d return IN_INDE
12f20 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74  X_NOOP.  In that
12f30 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61   case, the.** ca
12f40 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68  lling routine sh
12f50 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ould implement t
12f60 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75  he IN operator u
12f70 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a  sing a sequence.
12f80 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63  ** of Eq or Ne c
12f90 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
12fa0 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ions..**.** When
12fb0 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
12fc0 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
12fd0 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
12fe0 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
12ff0 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65  tion.** might ne
13000 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68  ed to know wheth
13010 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48  er or not the RH
13020 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  S side of the IN
13030 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e   operator.** con
13040 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49  tains a NULL.  I
13050 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69  f prRhsHasNull i
13060 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69  s not a NULL poi
13070 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20  nter and .** if 
13080 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
13090 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
130a0 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
130b0 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
130c0 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
130d0 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
130e0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
130f0 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
13100 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
13110 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49  *prRhsHasNull. I
13120 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
13130 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
13140 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ..) contains a.*
13150 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68  * NULL value, th
13160 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  en *prRhsHasNull
13170 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
13180 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
13190 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
131a0 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
131b0 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
131c0 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74  *prRhsHasNull, t
131d0 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
131e0 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
131f0 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  r will be NULL i
13200 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
13210 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
13220 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e.** NULL values
13230 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65  , and it will be
13240 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   some non-NULL v
13250 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72  alue if the b-tr
13260 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  ee contains no.*
13270 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  * NULL values..*
13280 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61  *.** If the aiMa
13290 70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  p parameter is n
132a0 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74  ot NULL, it must
132b0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72   point to an arr
132c0 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  ay containing.**
132d0 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72   one element for
132e0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74   each column ret
132f0 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
13300 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
13310 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74   the RHS.** of t
13320 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  he IN(...) opera
13330 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e  tor. The i'th en
13340 74 72 79 20 6f 66 20 74 68 65 20 61 72 72 61 79  try of the array
13350 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
13360 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74  th the.** offset
13370 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f   of the index co
13380 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65  lumn that matche
13390 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d  s the i'th colum
133a0 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  n returned by th
133b0 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72  e.** SELECT. For
133c0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
133d0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
133e0 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61  selected index a
133f0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f  re:.**.**   (?,?
13400 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61  ,?) IN (SELECT a
13410 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a  , b, c FROM t1).
13420 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
13430 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c  X i1 ON t1(b, c,
13440 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   a);.**.** then 
13450 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c  aiMap[] is popul
13460 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c  ated with {2, 0,
13470 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   1}..*/.#ifndef 
13480 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
13490 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
134a0 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50  FindInIndex(.  P
134b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
134c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
134d0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
134e0 20 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20    Expr *pX,     
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13500 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
13510 69 64 65 20 28 52 48 53 29 20 6f 66 20 74 68 65  ide (RHS) of the
13520 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
13530 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20    u32 inFlags,  
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13550 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f  IN_INDEX_LOOP, _
13560 4d 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f  MEMBERSHIP, and/
13570 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20  or _NOOP_OK */. 
13580 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75   int *prRhsHasNu
13590 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ll,         /* R
135a0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
135b0 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65  NULL status.  Se
135c0 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74  e notes */.  int
135d0 20 2a 61 69 4d 61 70 20 20 20 20 20 20 20 20 20   *aiMap         
135e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69          /* Mappi
135f0 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69  ng from Index fi
13600 65 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c  elds to RHS fiel
13610 64 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ds */.){.  Selec
13620 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  t *p;           
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13640 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68   /* SELECT to th
13650 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70  e right of IN op
13660 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
13670 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  eType = 0;      
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53    /* Type of RHS
136a0 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58   table. IN_INDEX
136b0 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  _* */.  int iTab
136c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
136d0 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +;            /*
136e0 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52   Cursor of the R
136f0 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  HS table */.  in
13700 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20  t mustBeUnique; 
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52      /* True if R
13730 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75  HS must be uniqu
13740 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
13750 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13760 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
13770 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
13780 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a  being coded */..
13790 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
137a0 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73  ==TK_IN );.  mus
137b0 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46  tBeUnique = (inF
137c0 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
137d0 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20  LOOP)!=0;..  /* 
137e0 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
137f0 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  is IN(...) opera
13800 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c  tor is a SELECT,
13810 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65   and if it matte
13820 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  rs .  ** whether
13830 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45   or not the SELE
13840 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  CT result contai
13850 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ns NULL values, 
13860 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20  check whether.  
13870 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69  ** or not NULL i
13880 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69  s actually possi
13890 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20  ble (it may not 
138a0 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  be, for example,
138b0 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f   due .  ** to NO
138c0 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
138d0 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
138e0 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61  ). If no NULL va
138f0 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c  lues are possibl
13900 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68  e,.  ** set prRh
13910 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65  sHasNull to 0 be
13920 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
13930 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73    */.  if( prRhs
13940 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e  HasNull && (pX->
13950 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
13960 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  lect) ){.    int
13970 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   i;.    ExprList
13980 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78   *pEList = pX->x
13990 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
139a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
139b0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
139c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
139d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
139e0 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69  Null(pEList->a[i
139f0 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61 6b  ].pExpr) ) break
13a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13a10 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  i==pEList->nExpr
13a20 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48   ){.      prRhsH
13a30 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  asNull = 0;.    
13a40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
13a50 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
13a60 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
13a70 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
13a80 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
13a90 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
13aa0 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
13ab0 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
13ac0 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
13ad0 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f  meral table.  */
13ae0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
13af0 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69  Err==0 && (p = i
13b00 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
13b10 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20  pt(pX))!=0 ){.  
13b20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13b30 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
13b40 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
13b50 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
13b60 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
13b70 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13b90 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20   Table <table>. 
13ba0 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20  */.    i16 iDb; 
13bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13bd0 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
13be0 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78  r pTab */.    Ex
13bf0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
13c00 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
13c10 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69  int nExpr = pELi
13c20 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20  st->nExpr;..    
13c30 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13c40 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t!=0 );         
13c50 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
13c60 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
13c70 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
13c80 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13c90 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  t->a[0].pExpr!=0
13ca0 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f   ); /* Because o
13cb0 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
13cc0 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
13cd0 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21  assert( p->pSrc!
13ce0 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
13cf0 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
13d00 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
13d10 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
13d20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
13d30 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20  a[0].pTab;..    
13d40 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72  /* Code an OP_Tr
13d50 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50  ansaction and OP
13d60 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c  _TableLock for <
13d70 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
13d80 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
13d90 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
13da0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
13db0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
13dc0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
13dd0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
13de0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
13df0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
13e00 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
13e10 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65  Name);..    asse
13e20 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74  rt(v);  /* sqlit
13e30 65 33 47 65 74 56 64 62 65 28 29 20 68 61 73 20  e3GetVdbe() has 
13e40 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65 76  always been prev
13e50 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f  iously called */
13e60 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d  .    if( nExpr==
13e70 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
13e80 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
13e90 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  <0 ){.      /* T
13ea0 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  he "x IN (SELECT
13eb0 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c   rowid FROM tabl
13ec0 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  e)" case */.    
13ed0 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
13ee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
13ef0 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20  v, OP_Once);.   
13f00 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
13f10 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  v);..      sqlit
13f20 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
13f30 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
13f40 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
13f50 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
13f60 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
13f70 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
13f80 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
13f90 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
13fa0 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
13fb0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13fd0 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
13fe0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
13ff0 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a  ffinity_ok = 1;.
14000 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20        int i;..  
14010 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
14020 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
14030 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
14040 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68   to perform each
14050 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
14060 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
14070 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
14080 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e  y of each column
14090 20 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20   in table.      
140a0 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ** on the RHS of
140b0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
140c0 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74  .  If it not, it
140d0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
140e0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65   to.      ** use
140f0 20 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68   any index of th
14100 65 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f  e RHS table.  */
14110 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
14120 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e  i<nExpr && affin
14130 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20  ity_ok; i++){.  
14140 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73        Expr *pLhs
14150 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
14160 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d  FieldSubexpr(pX-
14170 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
14180 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
14190 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
141a0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
141b0 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20      char idxaff 
141c0 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f  = sqlite3TableCo
141d0 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61  lumnAffinity(pTa
141e0 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20  b,iCol); /* RHS 
141f0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
14200 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73   char cmpaff = s
14210 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
14220 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61  inity(pLhs, idxa
14230 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ff);.        tes
14240 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53  tcase( cmpaff==S
14250 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
14260 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
14270 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49  se( cmpaff==SQLI
14280 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
14290 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63         switch( c
142a0 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20  mpaff ){.       
142b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
142c0 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20  FF_BLOB:.       
142d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
142e0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
142f0 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
14300 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
14310 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
14320 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73  y() only returns
14330 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64   TEXT if one sid
14340 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20  e or the.       
14350 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61       ** other ha
14360 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e  s no affinity an
14370 64 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  d the other side
14380 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65   is TEXT.  Hence
14390 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ,.            **
143a0 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f   the only way fo
143b0 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54  r cmpaff to be T
143c0 45 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66  EXT is for idxaf
143d0 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20  f to be TEXT.   
143e0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
143f0 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20  for the term on 
14400 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
14410 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66  N to have no aff
14420 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  inity. */.      
14430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64        assert( id
14440 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  xaff==SQLITE_AFF
14450 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20  _TEXT );.       
14460 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14470 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
14480 20 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e             affin
14490 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33  ity_ok = sqlite3
144a0 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
144b0 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  y(idxaff);.     
144c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
144d0 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79      if( affinity
144e0 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _ok ){.        /
144f0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
14500 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74  existing index t
14510 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f  hat will work fo
14520 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74  r this IN operat
14530 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  or */.        fo
14540 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
14550 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
14560 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78  pe==0; pIdx=pIdx
14570 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
14580 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55      Bitmask colU
14590 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c  sed;      /* Col
145a0 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
145b0 78 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  x used */.      
145c0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c      Bitmask mCol
145d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
145e0 6b 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  k for the curren
145f0 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20  t column */.    
14600 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
14610 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20  nColumn<nExpr ) 
14620 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14630 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
14640 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c  Column is BMS-2,
14650 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74   not BMS-1, so t
14660 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75  hat we can compu
14670 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
14680 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77  BITMASK(nExpr) w
14690 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69  ithout overflowi
146a0 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
146b0 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
146c0 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29  nColumn==BMS-2 )
146d0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
146e0 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
146f0 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  umn==BMS-1 );.  
14700 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14710 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31  ->nColumn>=BMS-1
14720 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14730 20 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42         if( mustB
14740 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20  eUnique ){.     
14750 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
14760 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20  >nKeyCol>nExpr. 
14770 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70              ||(p
14780 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78  Idx->nColumn>nEx
14790 70 72 20 26 26 20 21 49 73 55 6e 69 71 75 65 49  pr && !IsUniqueI
147a0 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20 20 20  ndex(pIdx)).    
147b0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
147c0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
147d0 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65  e;  /* This inde
147e0 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20  x is not unique 
147f0 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48 53 20  over the IN RHS 
14800 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
14810 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14820 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
14830 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20    colUsed = 0;  
14840 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69   /* Columns of i
14850 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66 61 72  ndex used so far
14860 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
14870 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
14880 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
14890 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
148a0 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
148b0 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
148c0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
148d0 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d      Expr *pRhs =
148e0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
148f0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
14900 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
14910 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
14920 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
14930 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29  rse, pLhs, pRhs)
14940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
14950 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  t j;.  .        
14960 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 71      assert( pReq
14970 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f  !=0 || pRhs->iCo
14980 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c  lumn==XN_ROWID |
14990 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
149a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
149b0 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20  r(j=0; j<nExpr; 
149c0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
149d0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
149e0 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d  Column[j]!=pRhs-
149f0 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >iColumn ) conti
14a00 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
14a10 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
14a20 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20  >azColl[j] );.  
14a30 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14a40 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74  pReq!=0 && sqlit
14a50 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e  e3StrICmp(pReq->
14a60 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
14a70 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20  oll[j])!=0 ){.  
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
14a90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
14aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14ab0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14ac0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14ad0 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45         if( j==nE
14ae0 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xpr ) break;.   
14af0 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20           mCol = 
14b00 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20  MASKBIT(j);.    
14b10 20 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c          if( mCol
14b20 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65   & colUsed ) bre
14b30 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75  ak; /* Each colu
14b40 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63  mn used only onc
14b50 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
14b60 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c   colUsed |= mCol
14b70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
14b80 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b  ( aiMap ) aiMap[
14b90 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  i] = j;.        
14ba0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
14bb0 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70   assert( i==nExp
14bc0 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d  r || colUsed!=(M
14bd0 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
14be0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
14bf0 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b  ( colUsed==(MASK
14c00 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b  BIT(nExpr)-1) ){
14c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
14c20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
14c30 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
14c40 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  ns the index pId
14c50 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20  x is usable */. 
14c60 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
14c70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
14c80 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
14c90 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
14ca0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
14cb0 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
14cc0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 0a  lan((pParse, 0,.
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
14cf0 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20 46 4f  SING INDEX %s FO
14d00 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70  R IN-OPERATOR",p
14d10 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
14d20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14d30 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14d40 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62  P_OpenRead, iTab
14d50 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
14d60 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
14d70 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
14d80 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
14d90 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
14da0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
14db0 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a  v, "%s", pIdx->z
14dc0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
14dd0 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49      assert( IN_I
14de0 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
14df0 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  == IN_INDEX_INDE
14e00 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20  X_ASC+1 );.     
14e10 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
14e20 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
14e30 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  C + pIdx->aSortO
14e40 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20  rder[0];.  .    
14e50 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52 68          if( prRh
14e60 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64  sHasNull ){.#ifd
14e70 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14e80 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
14e90 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
14ea0 69 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e  i64 mask = (1<<n
14eb0 45 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20  Expr)-1;.       
14ec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14ed0 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
14ee0 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
14ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14f00 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28     iTab, 0, 0, (
14f10 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e  u8*)&mask, P4_IN
14f20 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  T64);.#endif.   
14f30 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
14f40 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
14f50 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
14f60 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 78           if( nEx
14f70 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr==1 ){.       
14f80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14f90 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
14fa0 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61  , iTab, *prRhsHa
14fb0 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  sNull);.        
14fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
14ff0 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
15000 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15010 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f       } /* End lo
15020 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73 20  op over indexes 
15030 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e  */.      } /* En
15040 64 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f  d if( affinity_o
15050 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20  k ) */.    } /* 
15060 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f  End if not an ro
15070 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d  wid index */.  }
15080 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74 20   /* End attempt 
15090 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e  to optimize usin
150a0 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  g an index */.. 
150b0 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
150c0 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
150d0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
150e0 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
150f0 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
15100 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
15110 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
15120 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
15130 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
15140 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
15150 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
15160 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73   RHS is not cons
15170 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20  tant or has two 
15180 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a  or fewer terms,.
15190 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20    ** then it is 
151a0 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69  not worth creati
151b0 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
151c0 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74  table to evaluat
151d0 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70  e.  ** the IN op
151e0 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e  erator so return
151f0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a   IN_INDEX_NOOP..
15200 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
15210 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61  ==0.   && (inFla
15220 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  gs & IN_INDEX_NO
15230 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78  OP_OK).   && !Ex
15240 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
15250 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  , EP_xIsSelect).
15260 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
15270 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70  nRhsIsConstant(p
15280 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73  X) || pX->x.pLis
15290 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29  t->nExpr<=2).  )
152a0 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  {.    eType = IN
152b0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d  _INDEX_NOOP;.  }
152c0 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
152d0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
152e0 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
152f0 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
15300 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
15310 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
15320 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
15330 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
15340 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
15350 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
15360 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
15370 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
15380 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
15390 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
153a0 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
153b0 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
153c0 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
153d0 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
153e0 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
153f0 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
15400 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20  yLoop = 0;.     
15410 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
15420 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
15430 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
15440 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
15450 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  ){.        eType
15460 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
15470 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
15480 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
15490 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
154a0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
154b0 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
154c0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
154d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
154e0 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
154f0 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
15500 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
15510 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
15520 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
15530 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75  yLoop = savedNQu
15540 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  eryLoop;.  }else
15550 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
15560 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20   = iTab;.  }..  
15570 69 66 28 20 61 69 4d 61 70 20 26 26 20 65 54 79  if( aiMap && eTy
15580 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe!=IN_INDEX_IND
15590 45 58 5f 41 53 43 20 26 26 20 65 54 79 70 65 21  EX_ASC && eType!
155a0 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
155b0 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  DESC ){.    int 
155c0 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71  i, n;.    n = sq
155d0 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
155e0 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  ize(pX->pLeft);.
155f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
15600 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20  ; i++) aiMap[i] 
15610 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
15620 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
15630 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
15640 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
15650 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
15660 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f  Expr is an (?, ?
15670 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70  ...) IN(...) exp
15680 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a  ression. This .*
15690 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
156a0 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
156b0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
156c0 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
156d0 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69  ing .** the affi
156e0 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65  nities to be use
156f0 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  d for each colum
15700 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  n of the compari
15710 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  son..**.** It is
15720 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
15730 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
15740 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  r to ensure that
15750 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
15760 20 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74   string is event
15770 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
15780 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
15790 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
157a0 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74  r *exprINAffinit
157b0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
157c0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
157d0 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
157e0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
157f0 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
15800 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
15810 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74  pLeft);.  Select
15820 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78   *pSelect = (pEx
15830 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pr->flags & EP_x
15840 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70  IsSelect) ? pExp
15850 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30  r->x.pSelect : 0
15860 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a  ;.  char *zRet;.
15870 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
15880 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
15890 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44   zRet = sqlite3D
158a0 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61 72 73  bMallocRaw(pPars
158b0 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a  e->db, nVal+1);.
158c0 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20    if( zRet ){.  
158d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
158e0 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b  (i=0; i<nVal; i+
158f0 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
15900 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  pA = sqlite3Vect
15910 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
15920 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
15930 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33  char a = sqlite3
15940 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 41 29  ExprAffinity(pA)
15950 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
15960 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ect ){.        z
15970 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Ret[i] = sqlite3
15980 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
15990 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
159a0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b  >a[i].pExpr, a);
159b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
159c0 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20        zRet[i] = 
159d0 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  a;.      }.    }
159e0 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20  .    zRet[nVal] 
159f0 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65  = '\0';.  }.  re
15a00 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
15a10 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
15a20 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
15a30 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  Y./*.** Load the
15a40 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61   Parse object pa
15a50 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
15a60 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  t argument with 
15a70 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73  an error .** mes
15a80 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  sage of the form
15a90 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73  :.**.**   "sub-s
15aa0 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20  elect returns N 
15ab0 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
15ac0 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64  ed M".*/   .void
15ad0 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
15ae0 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50  tError(Parse *pP
15af0 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61  arse, int nActua
15b00 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b  l, int nExpect){
15b10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15b20 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63  Fmt = "sub-selec
15b30 74 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c  t returns %d col
15b40 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
15b50 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72  %d";.  sqlite3Er
15b60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a  rorMsg(pParse, z
15b70 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45  Fmt, nActual, nE
15b80 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  xpect);.}.#endif
15b90 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
15ba0 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76 65  on pExpr is a ve
15bb0 63 74 6f 72 20 74 68 61 74 20 68 61 73 20 62 65  ctor that has be
15bc0 65 6e 20 75 73 65 64 20 69 6e 20 61 20 63 6f 6e  en used in a con
15bd0 74 65 78 74 20 77 68 65 72 65 0a 2a 2a 20 69 74  text where.** it
15be0 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65   is not permitte
15bf0 64 2e 20 49 66 20 70 45 78 70 72 20 69 73 20 61  d. If pExpr is a
15c00 20 73 75 62 2d 73 65 6c 65 63 74 20 76 65 63 74   sub-select vect
15c10 6f 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  or, this routine
15c20 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65 20 50   .** loads the P
15c30 61 72 73 65 20 6f 62 6a 65 63 74 20 77 69 74 68  arse object with
15c40 20 61 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68   a message of th
15c50 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
15c60 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
15c70 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20  rns N columns - 
15c80 65 78 70 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a  expected 1".**.*
15c90 2a 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 61  * Or, if it is a
15ca0 20 72 65 67 75 6c 61 72 20 73 63 61 6c 61 72 20   regular scalar 
15cb0 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  vector:.**.**   
15cc0 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
15cd0 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73  ed".*/   .void s
15ce0 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f  qlite3VectorErro
15cf0 72 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61 72  rMsg(Parse *pPar
15d00 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
15d10 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
15d20 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
15d30 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
15d40 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
15d50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
15d60 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
15d70 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70  arse, pExpr->x.p
15d80 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
15d90 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c  nExpr, 1);.  }el
15da0 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
15db0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15dc0 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
15dd0 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
15de0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
15df0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73  erate code for s
15e00 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73  calar subqueries
15e10 20 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75   used as a subqu
15e20 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ery expression, 
15e30 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e  EXISTS,.** or IN
15e40 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61   operators.  Exa
15e50 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
15e60 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
15e70 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73  b)          -- s
15e80 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45  ubquery.**     E
15e90 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20  XISTS (SELECT a 
15ea0 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49  FROM b)   -- EXI
15eb0 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20  STS subquery.** 
15ec0 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31      x IN (4,5,11
15ed0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  )              -
15ee0 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
15ef0 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74  th list on right
15f00 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20  -hand side.**   
15f10 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61    x IN (SELECT a
15f20 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20   FROM b)     -- 
15f30 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
15f40 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
15f50 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65   right.**.** The
15f60 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
15f70 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65   describes the e
15f80 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
15f90 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a  ontains the IN.*
15fa0 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75  * operator or su
15fb0 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  bquery..**.** If
15fc0 20 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77   parameter isRow
15fd0 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  id is non-zero, 
15fe0 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
15ff0 70 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74  pExpr is guarant
16000 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20  eed.** to be of 
16010 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64  the form "<rowid
16020 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c  > IN (?, ?, ?)",
16030 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69   where <rowid> i
16040 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  s a reference.**
16050 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72   to some integer
16060 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61   key column of a
16070 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49   table B-Tree. I
16080 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65  n this case, use
16090 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d   an.** intkey B-
160a0 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68  Tree to store th
160b0 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29  e set of IN(...)
160c0 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20   values instead 
160d0 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
160e0 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c  (slower) variabl
160f0 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d  e length keys B-
16100 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  Tree..**.** If r
16110 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e  MayHaveNull is n
16120 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65  on-zero, that me
16130 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65  ans that the ope
16140 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a  ration is an IN.
16150 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54  ** (not a SELECT
16160 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20   or EXISTS) and 
16170 74 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67  that the RHS mig
16180 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  ht contains NULL
16190 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72  s..** All this r
161a0 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69  outine does is i
161b0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65  nitialize the re
161c0 67 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20  gister given by 
161d0 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20  rMayHaveNull.** 
161e0 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e  to NULL.  Callin
161f0 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  g routines will 
16200 74 61 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61  take care of cha
16210 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73  nging this regis
16220 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20  ter.** value to 
16230 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20  non-NULL if the 
16240 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65  RHS is NULL-free
16250 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45  ..**.** For a SE
16260 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f  LECT or EXISTS o
16270 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20  perator, return 
16280 74 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61  the register tha
16290 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72  t holds the.** r
162a0 65 73 75 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75  esult.  For a mu
162b0 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43  lti-column SELEC
162c0 54 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  T, the result is
162d0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e   stored in a con
162e0 74 69 67 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79  tiguous.** array
162f0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e   of registers an
16300 64 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  d the return val
16310 75 65 20 69 73 20 74 68 65 20 72 65 67 69 73 74  ue is the regist
16320 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d  er of the left-m
16330 6f 73 74 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  ost.** result co
16340 6c 75 6d 6e 2e 20 20 52 65 74 75 72 6e 20 30 20  lumn.  Return 0 
16350 66 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  for IN operators
16360 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
16370 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64  occurs..*/.#ifnd
16380 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16390 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
163a0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
163b0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
163c0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
163d0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
163e0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
163f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16400 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f  he IN, SELECT, o
16410 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
16420 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e  r */.  int rHasN
16430 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f  ullFlag,       /
16440 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
16450 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
16460 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52  NULLs exist in R
16470 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  HS */.  int isRo
16480 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
16490 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20  /* If true, LHS 
164a0 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  of IN operator i
164b0 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a  s a rowid */.){.
164c0 20 20 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d    int jmpIfDynam
164d0 69 63 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  ic = -1;        
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
164f0 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61   One-time test a
16500 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ddress */.  int 
16510 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rReg = 0;       
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16530 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
16540 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e  storing resultin
16550 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  g */.  Vdbe *v =
16560 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
16570 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e  pParse);.  if( N
16580 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
16590 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
165a0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
165b0 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  arse);..  /* The
165c0 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74   evaluation of t
165d0 68 65 20 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c  he IN/EXISTS/SEL
165e0 45 43 54 20 6d 75 73 74 20 62 65 20 72 65 70 65  ECT must be repe
165f0 61 74 65 64 20 65 76 65 72 79 20 74 69 6d 65 20  ated every time 
16600 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75  it.  ** is encou
16610 6e 74 65 72 65 64 20 69 66 20 61 6e 79 20 6f 66  ntered if any of
16620 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
16630 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  s true:.  **.  *
16640 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
16650 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
16660 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
16670 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20  uery.  **    *  
16680 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
16690 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73  ide is an expres
166a0 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
166b0 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20  ning variables. 
166c0 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65   **    *  We are
166d0 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65   inside a trigge
166e0 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61  r.  **.  ** If a
166f0 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
16700 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  are false, then 
16710 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20  we can run this 
16720 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20  code just once. 
16730 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73   ** save the res
16740 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20  ults, and reuse 
16750 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20  the same result 
16760 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  on subsequent in
16770 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  vocations..  */.
16780 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
16790 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
167a0 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20  _VarSelect) ){. 
167b0 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20     jmpIfDynamic 
167c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
167d0 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
167e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
167f0 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
16800 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
16810 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
16820 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20        int addr; 
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
16850 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
16860 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
16870 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
16880 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
16890 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20  ; /* the LHS of 
168a0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
168b0 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  */.      KeyInfo
168c0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
168d0 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f       /* Key info
168e0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
168f0 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20   int nVal;      
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16910 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70  Size of vector p
16920 4c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a 20  Left */.      . 
16930 20 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69       nVal = sqli
16940 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
16950 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  e(pLeft);.      
16960 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
16970 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a   || nVal==1 );..
16980 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72        /* Whether
16990 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49   this is an 'x I
169a0 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72  N(SELECT...)' or
169b0 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c   an 'x IN(<exprl
169c0 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20  ist>)'.      ** 
169d0 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73  expression it is
169e0 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d   handled the sam
169f0 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d  e way.  An ephem
16a00 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20  eral table is . 
16a10 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
16a20 69 74 68 20 69 6e 64 65 78 20 6b 65 79 73 20 72  ith index keys r
16a30 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
16a40 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
16a50 20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43   .      ** SELEC
16a60 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69  T or the <exprli
16a70 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  st>..      **.  
16a80 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78      ** If the 'x
16a90 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ' expression is 
16aa0 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
16ab0 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
16ac0 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
16ad0 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f  ent returns a co
16ae0 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  lumn value, then
16af0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
16b00 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
16b10 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f  olumn is used to
16b20 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78   build the index
16b30 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27   keys. If both '
16b40 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20  x' and the.     
16b50 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74   ** SELECT... st
16b60 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
16b70 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
16b80 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  c affinity is us
16b90 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65  ed.      ** if e
16ba0 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73  ither column has
16bb0 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45   NUMERIC or INTE
16bc0 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66  GER affinity. If
16bd0 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a   neither.      *
16be0 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45  * 'x' nor the SE
16bf0 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
16c00 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
16c10 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
16c20 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73  nity.      ** is
16c30 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   used..      */.
16c40 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
16c50 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ble = pParse->nT
16c60 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72  ab++;.      addr
16c70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16c80 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
16c90 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20  phemeral, .     
16ca0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
16cb0 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e  le, (isRowid?0:n
16cc0 56 61 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b 65  Val));.      pKe
16cd0 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20  yInfo = isRowid 
16ce0 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79  ? 0 : sqlite3Key
16cf0 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
16d00 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a  ->db, nVal, 1);.
16d10 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
16d20 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16d30 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
16d40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
16d50 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
16d60 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
16d70 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
16d80 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
16d90 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
16da0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
16db0 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
16dc0 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
16dd0 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
16de0 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
16df0 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
16e00 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
16e10 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72  *pSelect = pExpr
16e20 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
16e30 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
16e40 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
16e50 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20  >pEList;..      
16e60 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
16e70 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
16e80 25 73 4c 49 53 54 20 53 55 42 51 55 45 52 59 22  %sLIST SUBQUERY"
16e90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ,.            jm
16ea0 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22  pIfDynamic>=0?""
16eb0 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 0a 20  :"CORRELATED ". 
16ec0 20 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20         ));.     
16ed0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f     assert( !isRo
16ee0 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  wid );.        /
16ef0 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64  * If the LHS and
16f00 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
16f10 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d  perator do not m
16f20 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20 20 20  atch, that.     
16f30 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c     ** error will
16f40 20 68 61 76 65 20 62 65 65 6e 20 63 61 75 67 68   have been caugh
16f50 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65  t long before we
16f60 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
16f70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  t. */.        if
16f80 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74 2d  ( ALWAYS(pEList-
16f90 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b  >nExpr==nVal) ){
16fa0 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
16fb0 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
16fc0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
16fd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
16fe0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
16ff0 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78  st, SRT_Set, pEx
17000 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
17010 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66         dest.zAff
17020 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66  Sdst = exprINAff
17030 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45  inity(pParse, pE
17040 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
17050 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
17060 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 0;.          t
17070 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74  estcase( pSelect
17080 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
17090 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
170a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
170b0 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f  pKeyInfo==0 ); /
170c0 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20  * Caused by OOM 
170d0 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  in sqlite3KeyInf
170e0 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20  oAlloc() */.    
170f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
17100 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
17110 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
17120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
17130 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
17140 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
17150 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
17160 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
17170 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
17180 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
17190 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
171a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
171b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
171c0 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
171d0 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
171e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
171f0 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
17200 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
17210 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
17220 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
17230 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
17240 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
17250 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
17260 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
17270 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17280 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
17290 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
172a0 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
172b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
172c0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
172d0 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73       Expr *p = s
172e0 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
172f0 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
17300 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
17310 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
17320 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  i] = sqlite3Bina
17330 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
17340 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
17350 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c    pParse, p, pEL
17360 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a  ist->a[i].pExpr.
17370 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
17380 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17390 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
173a0 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
173b0 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29  r->x.pList!=0) )
173c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
173d0 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
173e0 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
173f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
17400 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
17410 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
17420 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
17430 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
17440 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
17450 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
17460 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
17470 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
17480 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
17490 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
174a0 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
174b0 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
174c0 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
174d0 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
174e0 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
174f0 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
17500 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
17510 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
17520 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
17530 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66    /* Affinity of
17540 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
17550 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  IN */.        in
17560 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
17570 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
17580 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
17590 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
175a0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
175b0 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  em;.        int 
175c0 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20  r1, r2, r3;.    
175d0 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
175e0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
175f0 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  ty(pLeft);.     
17600 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
17610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
17620 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
17630 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
17640 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
17650 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
17660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
17670 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
17680 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f  iteable(pKeyInfo
17690 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
176a0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
176b0 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
176c0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
176d0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
176e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
176f0 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
17700 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
17710 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
17720 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  */.        r1 = 
17730 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17740 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
17750 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
17760 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17770 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
17780 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33  sRowid ) sqlite3
17790 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
177a0 5f 42 6c 6f 62 2c 20 30 2c 20 72 32 2c 20 30 2c  _Blob, 0, r2, 0,
177b0 20 22 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b   "", P4_STATIC);
177c0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
177d0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
177e0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
177f0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
17800 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
17810 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
17820 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
17830 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20  nt iValToIns;.. 
17840 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
17850 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
17860 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
17870 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
17880 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
17890 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
178a0 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
178b0 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
178c0 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
178d0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
178e0 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
178f0 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
17900 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
17910 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
17920 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
17930 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
17940 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
17950 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
17960 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44        if( jmpIfD
17970 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71  ynamic>=0 && !sq
17980 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
17990 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
179a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
179b0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
179c0 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29  v, jmpIfDynamic)
179d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ;.            jm
179e0 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b  pIfDynamic = -1;
179f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
17a00 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
17a10 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
17a20 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
17a30 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
17a40 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
17a50 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26    if( isRowid &&
17a60 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
17a70 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c  teger(pE2, &iVal
17a80 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20  ToIns) ){.      
17a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17aa0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
17ab0 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e  sertInt, pExpr->
17ac0 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c  iTable, r2, iVal
17ad0 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  ToIns);.        
17ae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17af0 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
17b00 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
17b10 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
17b20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
17b30 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
17b40 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17b50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17b60 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33  OP_MustBeInt, r3
17b70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
17ba0 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
17bc0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
17be0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17bf0 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78  , OP_Insert, pEx
17c00 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
17c10 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r3);.           
17c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17c40 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
17c50 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c  keRecord, r3, 1,
17c60 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
17c70 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
17c80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17c90 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
17ca0 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b  (pParse, r3, 1);
17cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
17cc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17cd0 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
17ce0 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
17cf0 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a  le, r2, r3, 1);.
17d00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
17d10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17d20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
17d30 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17d40 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
17d50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
17d60 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
17d70 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
17d80 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  }.      if( pKey
17d90 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
17da0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
17db0 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
17dc0 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  id *)pKeyInfo, P
17dd0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
17de0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
17df0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
17e00 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
17e10 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
17e20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
17e30 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20       /* Case 3: 
17e40 20 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46     (SELECT ... F
17e50 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a  ROM ...).      *
17e60 2a 20 20 20 20 20 6f 72 3a 20 20 20 20 45 58 49  *     or:    EXI
17e70 53 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  STS(SELECT ... F
17e80 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a  ROM ...).      *
17e90 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
17ea0 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74   SELECT, generat
17eb0 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
17ec0 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c  e values for all
17ed0 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20   columns of.    
17ee0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
17ef0 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ow into an array
17f00 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e   of registers an
17f10 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64  d return the ind
17f20 65 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ex of.      ** t
17f30 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
17f40 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
17f50 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
17f60 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
17f70 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e   an integer 0 (n
17f80 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20  ot exists) or 1 
17f90 28 65 78 69 73 74 73 29 0a 20 20 20 20 20 20 2a  (exists).      *
17fa0 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
17fb0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  r and return tha
17fc0 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
17fd0 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
17fe0 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73    ** In both cas
17ff0 65 73 2c 20 74 68 65 20 71 75 65 72 79 20 69 73  es, the query is
18000 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
18010 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79 20  "LIMIT 1".  Any 
18020 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 65 78 69  .      ** preexi
18030 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 64  sting limit is d
18040 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61 63  iscarded in plac
18050 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49 4d  e of the new LIM
18060 49 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  IT 1..      */. 
18070 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
18080 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
18090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
180a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
180b0 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20  o encode */.    
180c0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
180d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
180e0 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
180f0 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
18100 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  CT result */.   
18110 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20     int nReg;    
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
18140 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
18150 65 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  e */.      Expr 
18160 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  *pLimit;        
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18180 20 2f 2a 20 4e 65 77 20 6c 69 6d 69 74 20 65 78   /* New limit ex
18190 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20 20  pression */..   
181a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
181b0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
181c0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
181d0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
181e0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
181f0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
18200 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
18210 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
18220 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
18230 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
18240 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
18250 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
18260 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ..      pSel = p
18270 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
18280 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75  .      ExplainQu
18290 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
182a0 20 31 2c 20 22 25 73 53 43 41 4c 41 52 20 53 55   1, "%sSCALAR SU
182b0 42 51 55 45 52 59 22 2c 0a 20 20 20 20 20 20 20  BQUERY",.       
182c0 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
182d0 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41  c>=0?"":"CORRELA
182e0 54 45 44 20 22 29 29 3b 0a 20 20 20 20 20 20 6e  TED "));.      n
182f0 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d  Reg = pExpr->op=
18300 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53 65  =TK_SELECT ? pSe
18310 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l->pEList->nExpr
18320 20 3a 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   : 1;.      sqli
18330 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
18340 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61 72  t(&dest, 0, pPar
18350 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20  se->nMem+1);.   
18360 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
18370 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 69  += nReg;.      i
18380 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
18390 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
183a0 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
183b0 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20  SRT_Mem;.       
183c0 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65   dest.iSdst = de
183d0 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
183e0 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d      dest.nSdst =
183f0 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 20 20 73   nReg;.        s
18400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
18410 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
18420 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65  dest.iSDParm, de
18430 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d  st.iSDParm+nReg-
18440 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
18450 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
18460 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
18470 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t"));.      }els
18480 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  e{.        dest.
18490 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73  eDest = SRT_Exis
184a0 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
184b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
184c0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
184d0 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
184e0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
184f0 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49  nt((v, "Init EXI
18500 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  STS result"));. 
18510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69       }.      pLi
18520 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mit = sqlite3Exp
18530 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
18540 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 26 73  b, TK_INTEGER,&s
18550 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
18560 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  1], 0);.      if
18570 28 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29  ( pSel->pLimit )
18580 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18590 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
185a0 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c  se->db, pSel->pL
185b0 69 6d 69 74 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  imit->pLeft);.  
185c0 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d        pSel->pLim
185d0 69 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 69 6d  it->pLeft = pLim
185e0 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  it;.      }else{
185f0 0a 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  .        pSel->p
18600 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
18610 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
18620 4c 49 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30  LIMIT, pLimit, 0
18630 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18640 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20   pSel->iLimit = 
18650 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  0;.      if( sql
18660 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
18670 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20  e, pSel, &dest) 
18680 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
18690 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
186a0 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69     rReg = dest.i
186b0 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78  SDParm;.      Ex
186c0 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
186d0 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
186e0 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  uce);.      brea
186f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
18700 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  if( rHasNullFlag
18710 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
18720 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c  etHasNullFlag(v,
18730 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
18740 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20  rHasNullFlag);. 
18750 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44   }..  if( jmpIfD
18760 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20  ynamic>=0 ){.   
18770 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
18780 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e  Here(v, jmpIfDyn
18790 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  amic);.  }.  sql
187a0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
187b0 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74  (pParse);..  ret
187c0 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64  urn rReg;.}.#end
187d0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
187e0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
187f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18800 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
18810 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e  * Expr pIn is an
18820 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   IN(...) express
18830 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ion. This functi
18840 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  on checks that t
18850 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63  he .** sub-selec
18860 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
18870 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f  the IN() operato
18880 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  r has the same n
18890 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c  umber of .** col
188a0 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74  umns as the vect
188b0 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f  or on the LHS. O
188c0 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66  r, if the RHS of
188d0 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74   the IN() is not
188e0 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79   .** a sub-query
188f0 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69  , that the LHS i
18900 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69  s a vector of si
18910 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ze 1..*/.int sql
18920 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28  ite3ExprCheckIN(
18930 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
18940 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74  xpr *pIn){.  int
18950 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nVector = sqlit
18960 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
18970 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  (pIn->pLeft);.  
18980 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20  if( (pIn->flags 
18990 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
189a0 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74  ){.    if( nVect
189b0 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65  or!=pIn->x.pSele
189c0 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
189d0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
189e0 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
189f0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e  (pParse, pIn->x.
18a00 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
18a10 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29  >nExpr, nVector)
18a20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
18a30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
18a40 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29  if( nVector!=1 )
18a50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65 63  {.    sqlite3Vec
18a60 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72  torErrorMsg(pPar
18a70 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b  se, pIn->pLeft);
18a80 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
18a90 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
18aa0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
18ab0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
18ac0 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
18ad0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
18ae0 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   IN expression..
18af0 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
18b00 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20  (SELECT ...).** 
18b10 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65       x IN (value
18b20 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a  , value, ...).**
18b30 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  .** The left-han
18b40 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20  d side (LHS) is 
18b50 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74  a scalar or vect
18b60 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  or expression.  
18b70 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61  The .** right-ha
18b80 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73  nd side (RHS) is
18b90 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72   an array of zer
18ba0 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72  o or more scalar
18bb0 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a   values, or a.**
18bc0 20 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74   subquery.  If t
18bd0 68 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71  he RHS is a subq
18be0 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  uery, the number
18bf0 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
18c00 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68  ns must.** match
18c10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
18c20 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65  olumns in the ve
18c30 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e  ctor on the LHS.
18c40 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a    If the RHS is.
18c50 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c  ** a list of val
18c60 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73  ues, the LHS mus
18c70 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a  t be a scalar. .
18c80 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65  **.** The IN ope
18c90 72 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66  rator is true if
18ca0 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69   the LHS value i
18cb0 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  s contained with
18cc0 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54  in the RHS..** T
18cd0 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c  he result is fal
18ce0 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  se if the LHS is
18cf0 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20   definitely not 
18d00 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65  in the RHS.  The
18d10 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e   .** result is N
18d20 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65  ULL if the prese
18d30 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69  nce of the LHS i
18d40 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74  n the RHS cannot
18d50 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   be .** determin
18d60 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e  ed due to NULLs.
18d70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18d80 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
18d90 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f  de that jumps to
18da0 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20   destIfFalse if 
18db0 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a  the LHS is not .
18dc0 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
18dd0 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66  hin the RHS.  If
18de0 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65   due to NULLs we
18df0 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
18e00 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20  e if the LHS.** 
18e10 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
18e20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d  the RHS then jum
18e30 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e  p to destIfNull.
18e40 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20    If the LHS is 
18e50 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74  contained.** wit
18e60 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e  hin the RHS then
18e70 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a   fall through..*
18e80 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70  *.** See the sep
18e90 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f  arate in-operato
18ea0 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69  r.md documentati
18eb0 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63  on file in the c
18ec0 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69  anonical.** SQLi
18ed0 74 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66  te source tree f
18ee0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
18ef0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
18f00 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
18f10 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50  3ExprCodeIN(.  P
18f20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18f30 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
18f40 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
18f50 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
18f60 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
18f70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
18f80 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
18f90 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
18fa0 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ,      /* Jump h
18fb0 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f  ere if LHS is no
18fc0 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
18fd0 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
18fe0 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20  destIfNull      
18ff0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
19000 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
19010 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f  e unknown due to
19020 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69   NULLs */.){.  i
19030 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d  nt rRhsHasNull =
19040 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72   0;  /* Register
19050 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66   that is true if
19060 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55   RHS contains NU
19070 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  LL values */.  i
19080 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
19090 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
190a0 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
190b0 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20   rLhs;          
190c0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73     /* Register(s
190d0 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48  ) holding the LH
190e0 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  S values */.  in
190f0 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20  t rLhsOrig;     
19100 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65      /* LHS value
19110 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64  s prior to reord
19120 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d  ering by aiMap[]
19130 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
19140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19150 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
19160 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
19170 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b   int *aiMap = 0;
19180 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72         /* Map fr
19190 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20  om vector field 
191a0 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  to index column 
191b0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20  */.  char *zAff 
191c0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66  = 0;       /* Af
191d0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f  finity string fo
191e0 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f  r comparisons */
191f0 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20  .  int nVector; 
19200 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
19210 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20   of vectors for 
19220 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72  this IN operator
19230 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79   */.  int iDummy
19240 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
19250 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74  ummy parameter t
19260 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  o exprCodeVector
19270 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  () */.  Expr *pL
19280 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eft;          /*
19290 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   The LHS of the 
192a0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
192b0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
192c0 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63         /* loop c
192d0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
192e0 64 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20  destStep2;      
192f0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75    /* Where to ju
19300 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65  mp when NULLs se
19310 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a  en in step 2 */.
19320 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20    int destStep6 
19330 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74  = 0;    /* Start
19340 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65   of code for Ste
19350 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  p 6 */.  int add
19360 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f  rTruthOp;      /
19370 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63  * Address of opc
19380 6f 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69  ode that determi
19390 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72  nes the IN is tr
193a0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ue */.  int dest
193b0 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a  NotNull;      /*
193c0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20   Jump here if a 
193d0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f  comparison is no
193e0 74 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36  t true in step 6
193f0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
19400 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  p;          /* T
19410 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36  op of the step-6
19420 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65   loop */ ..  pLe
19430 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
19440 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  t;.  if( sqlite3
19450 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72  ExprCheckIN(pPar
19460 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74  se, pExpr) ) ret
19470 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78  urn;.  zAff = ex
19480 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61  prINAffinity(pPa
19490 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e  rse, pExpr);.  n
194a0 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Vector = sqlite3
194b0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
194c0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
194d0 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71  aiMap = (int*)sq
194e0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
194f0 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  o(.      pParse-
19500 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69  >db, nVector*(si
19510 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65  zeof(int) + size
19520 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20  of(char)) + 1.  
19530 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
19540 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
19550 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33  d ) goto sqlite3
19560 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65  ExprCodeIN_oom_e
19570 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65  rror;..  /* Atte
19580 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  mpt to compute t
19590 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68  he RHS. After th
195a0 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74  is step, if anyt
195b0 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a  hing other than.
195c0 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f    ** IN_INDEX_NO
195d0 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OP is returned, 
195e0 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64  the table opened
195f0 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78 70   ith cursor pExp
19600 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20  r->iTable .  ** 
19610 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
19620 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ues that make up
19630 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f   the RHS. If IN_
19640 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65  INDEX_NOOP is re
19650 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65  turned,.  ** the
19660 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74   RHS has not yet
19670 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f   been coded.  */
19680 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
19690 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
196a0 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
196b0 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72   OOM detected pr
196c0 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ior to this rout
196d0 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ine */.  VdbeNoo
196e0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
196f0 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  gin IN expr"));.
19700 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
19710 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
19720 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20  rse, pExpr,.    
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19740 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45           IN_INDE
19750 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49  X_MEMBERSHIP | I
19760 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c  N_INDEX_NOOP_OK,
19770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
19790 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
197a0 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68  fNull ? 0 : &rRh
197b0 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29  sHasNull, aiMap)
197c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
197d0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65  rse->nErr || nVe
197e0 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65  ctor==1 || eType
197f0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20  ==IN_INDEX_EPH. 
19800 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
19810 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
19820 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f  SC || eType==IN_
19830 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
19840 20 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51   .  );.#ifdef SQ
19850 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
19860 43 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d  Confirm that aiM
19870 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56  ap[] contains nV
19880 65 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61  ector integer va
19890 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30 20 61  lues between 0 a
198a0 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d  nd.  ** nVector-
198b0 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  1. */.  for(i=0;
198c0 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
198d0 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74  {.    int j, cnt
198e0 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d  ;.    for(cnt=j=
198f0 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b  0; j<nVector; j+
19900 2b 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d  +) if( aiMap[j]=
19910 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20  =i ) cnt++;.    
19920 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29  assert( cnt==1 )
19930 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
19940 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c  /* Code the LHS,
19950 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
19960 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
19970 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69  )". If the LHS i
19980 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72  s a .  ** vector
19990 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f  , then it is sto
199a0 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20  red in an array 
199b0 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73  of nVector regis
199c0 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20  ters starting . 
199d0 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a   ** at r1..  **.
199e0 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64    ** sqlite3Find
199f0 49 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20  InIndex() might 
19a00 68 61 76 65 20 72 65 6f 72 64 65 72 65 64 20 74  have reordered t
19a10 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  he fields of the
19a20 20 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a   LHS vector.  **
19a30 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 69 65   so that the fie
19a40 6c 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73  lds are in the s
19a50 61 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20  ame order as an 
19a60 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20  existing index. 
19a70 20 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70    The.  ** aiMap
19a80 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
19a90 73 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d  s a mapping from
19aa0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48   the original LH
19ab0 53 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f  S field order to
19ac0 0a 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20  .  ** the field 
19ad0 6f 72 64 65 72 20 74 68 61 74 20 6d 61 74 63 68  order that match
19ae0 65 73 20 74 68 65 20 52 48 53 20 69 6e 64 65 78  es the RHS index
19af0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
19b00 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
19b10 61 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72 69  arse);.  rLhsOri
19b20 67 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74  g = exprCodeVect
19b30 6f 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  or(pParse, pLeft
19b40 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f  , &iDummy);.  fo
19b50 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
19b60 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b   && aiMap[i]==i;
19b70 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c   i++){} /* Are L
19b80 48 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65  HS fields reorde
19b90 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d  red? */.  if( i=
19ba0 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20  =nVector ){.    
19bb0 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72  /* LHS fields ar
19bc0 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20  e not reordered 
19bd0 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c  */.    rLhs = rL
19be0 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b  hsOrig;.  }else{
19bf0 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
19c00 72 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20  reorder the LHS 
19c10 66 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67  fields according
19c20 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20   to aiMap */.   
19c30 20 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47   rLhs = sqlite3G
19c40 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
19c50 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  se, nVector);.  
19c60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
19c70 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
19c80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19c90 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
19ca0 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73  rLhsOrig+i, rLhs
19cb0 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20  +aiMap[i], 0);. 
19cc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
19cd0 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  f sqlite3FindInI
19ce0 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66  ndex() did not f
19cf0 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e  ind or create an
19d00 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20   index that is. 
19d10 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72   ** suitable for
19d20 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
19d30 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65  IN operator, the
19d40 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67  n evaluate using
19d50 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65   a.  ** sequence
19d60 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e   of comparisons.
19d70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
19d80 69 73 20 73 74 65 70 20 28 31 29 20 69 6e 20 74  is step (1) in t
19d90 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d  he in-operator.m
19da0 64 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f  d optimized algo
19db0 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  rithm..  */.  if
19dc0 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
19dd0 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78  X_NOOP ){.    Ex
19de0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
19df0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
19e00 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
19e10 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
19e20 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
19e30 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
19e40 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d     int labelOk =
19e50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19e60 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e  Label(v);.    in
19e70 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b  t r2, regToFree;
19e80 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75  .    int regCkNu
19e90 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ll = 0;.    int 
19ea0 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ii;.    assert( 
19eb0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
19ec0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
19ed0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
19ee0 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73   destIfNull!=des
19ef0 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
19f00 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71    regCkNull = sq
19f10 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19f20 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
19f30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19f40 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72  (v, OP_BitAnd, r
19f50 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b  Lhs, rLhs, regCk
19f60 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Null);.    }.   
19f70 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c   for(ii=0; ii<pL
19f80 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  ist->nExpr; ii++
19f90 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  ){.      r2 = sq
19fa0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
19fb0 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  p(pParse, pList-
19fc0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72  >a[ii].pExpr, &r
19fd0 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20  egToFree);.     
19fe0 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26   if( regCkNull &
19ff0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
1a000 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b  BeNull(pList->a[
1a010 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  ii].pExpr) ){.  
1a020 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a030 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
1a040 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c  tAnd, regCkNull,
1a050 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r2, regCkNull);
1a060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a070 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  f( ii<pList->nEx
1a080 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75  pr-1 || destIfNu
1a090 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
1a0a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a0b0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1a0c0 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62  OP_Eq, rLhs, lab
1a0d0 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20  elOk, r2,.      
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
1a100 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1a110 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1a120 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73  ageIf(v, ii<pLis
1a130 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
1a140 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1a150 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74  eIf(v, ii==pList
1a160 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
1a170 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1a180 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b  hangeP5(v, zAff[
1a190 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
1a1a0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1a1b0 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
1a1c0 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20  stIfFalse );.   
1a1d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a1e0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
1a1f0 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c   rLhs, destIfFal
1a200 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  se, r2,.        
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a220 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
1a230 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62  P4_COLLSEQ); Vdb
1a240 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a250 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a260 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66  eChangeP5(v, zAf
1a270 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55  f[0] | SQLITE_JU
1a280 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1a290 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1a2a0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1a2b0 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65  Parse, regToFree
1a2c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1a2d0 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20   regCkNull ){.  
1a2e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a2f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
1a300 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64  ll, regCkNull, d
1a310 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65  estIfNull); Vdbe
1a320 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1a340 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  to(v, destIfFals
1a350 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
1a360 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1a370 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b  Label(v, labelOk
1a380 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1a390 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1a3a0 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b  rse, regCkNull);
1a3b0 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65  .    goto sqlite
1a3c0 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
1a3d0 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  shed;.  }..  /* 
1a3e0 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f  Step 2: Check to
1a3f0 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20   see if the LHS 
1a400 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
1a410 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74  L columns.  If t
1a420 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73  he.  ** LHS does
1a430 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74   contain NULLs t
1a440 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hen the result m
1a450 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46 41  ust be either FA
1a460 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a  LSE or NULL..  *
1a470 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73  * We will then s
1a480 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20 73  kip the binary s
1a490 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48 53  earch of the RHS
1a4a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
1a4b0 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
1a4c0 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74  alse ){.    dest
1a4d0 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46 61  Step2 = destIfFa
1a4e0 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lse;.  }else{.  
1a4f0 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65    destStep2 = de
1a500 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65  stStep6 = sqlite
1a510 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1a520 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1a530 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
1a540 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
1a550 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
1a560 65 6c 64 53 75 62 65 78 70 72 28 70 45 78 70 72  eldSubexpr(pExpr
1a570 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  ->pLeft, i);.   
1a580 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1a590 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a  CanBeNull(p) ){.
1a5a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a5b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
1a5c0 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65  Null, rLhs+i, de
1a5d0 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20  stStep2);.      
1a5e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a5f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1a600 20 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48   Step 3.  The LH
1a610 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74  S is now known t
1a620 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20  o be non-NULL.  
1a630 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  Do the binary se
1a640 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65  arch.  ** of the
1a650 20 52 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c   RHS using the L
1a660 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20  HS as a probe.  
1a670 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65  If found, the re
1a680 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75  sult is.  ** tru
1a690 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1a6a0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
1a6b0 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  WID ){.    /* In
1a6c0 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
1a6d0 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44  RHS is the ROWID
1a6e0 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65   of table b-tree
1a6f0 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a   and so we also.
1a700 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74      ** know that
1a710 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d   the RHS is non-
1a720 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65  NULL.  Hence, we
1a730 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33   combine steps 3
1a740 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e   and 4.    ** in
1a750 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  to a single opco
1a760 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  de. */.    sqlit
1a770 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1a780 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70 45  OP_SeekRowid, pE
1a790 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
1a7a0 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b  tIfFalse, rLhs);
1a7b0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1a7c0 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54 72  e(v);.    addrTr
1a7d0 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56  uthOp = sqlite3V
1a7e0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
1a7f0 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72  Goto);  /* Retur
1a800 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73  n True */.  }els
1a810 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
1a820 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
1a830 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e  ffinity, rLhs, n
1a840 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c  Vector, 0, zAff,
1a850 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 69   nVector);.    i
1a860 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d  f( destIfFalse==
1a870 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  destIfNull ){.  
1a880 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53      /* Combine S
1a890 74 65 70 20 33 20 61 6e 64 20 53 74 65 70 20 35  tep 3 and Step 5
1a8a0 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f   into a single o
1a8b0 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73  pcode */.      s
1a8c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a8d0 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
1a8e0 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
1a8f0 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a  e, destIfFalse,.
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a910 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c             rLhs,
1a920 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43   nVector); VdbeC
1a930 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1a940 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78    goto sqlite3Ex
1a950 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
1a960 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
1a970 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c  Ordinary Step 3,
1a980 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
1a990 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55  ere FALSE and NU
1a9a0 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  LL are distinct 
1a9b0 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74 68  */.    addrTruth
1a9c0 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
1a9d0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
1a9e0 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
1a9f0 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  able, 0,.       
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1aa20 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56  Lhs, nVector); V
1aa30 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1aa40 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34    }..  /* Step 4
1aa50 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
1aa60 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e   known to be non
1aa70 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69 64  -NULL and we did
1aa80 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61   not find.  ** a
1aa90 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20 73  n match on the s
1aaa0 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68 65  earch above, the
1aab0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73  n the result mus
1aac0 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f  t be FALSE..  */
1aad0 0a 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75  .  if( rRhsHasNu
1aae0 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31  ll && nVector==1
1aaf0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1ab00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ab10 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73  NotNull, rRhsHas
1ab20 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73  Null, destIfFals
1ab30 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  e);.    VdbeCove
1ab40 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
1ab50 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20 77  /* Step 5.  If w
1ab60 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1ab70 6f 75 74 20 74 68 65 20 64 69 66 66 65 72 65 6e  out the differen
1ab80 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20  ce between NULL 
1ab90 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20  and.  ** FALSE, 
1aba0 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
1abb0 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20   false. .  */.  
1abc0 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d  if( destIfFalse=
1abd0 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73 71  =destIfNull ) sq
1abe0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1abf0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a   destIfFalse);..
1ac00 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f    /* Step 6: Loo
1ac10 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20 6f  p through rows o
1ac20 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d 70  f the RHS.  Comp
1ac30 61 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f 20  are each row to 
1ac40 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66  the LHS..  ** If
1ac50 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20   any comparison 
1ac60 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
1ac70 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
1ac80 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63  .  If all.  ** c
1ac90 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20 46  omparisons are F
1aca0 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66 69  ALSE then the fi
1acb0 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46 41  nal result is FA
1acc0 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  LSE..  **.  ** F
1acd0 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53 2c  or a scalar LHS,
1ace0 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e   it is sufficien
1acf0 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74 20  t to check just 
1ad00 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20 20  the first row.  
1ad10 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20  ** of the RHS.. 
1ad20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53 74   */.  if( destSt
1ad30 65 70 36 20 29 20 73 71 6c 69 74 65 33 56 64 62  ep6 ) sqlite3Vdb
1ad40 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1ad50 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20 61   destStep6);.  a
1ad60 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
1ad70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ad80 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e  _Rewind, pExpr->
1ad90 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
1ada0 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  lse);.  VdbeCove
1adb0 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e  rage(v);.  if( n
1adc0 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Vector>1 ){.    
1add0 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71  destNotNull = sq
1ade0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1adf0 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  el(v);.  }else{.
1ae00 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74      /* For nVect
1ae10 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73  or==1, combine s
1ae20 74 65 70 73 20 36 20 61 6e 64 20 37 20 62 79 20  teps 6 and 7 by 
1ae30 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
1ae40 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c  rning.    ** FAL
1ae50 53 45 20 69 66 20 74 68 65 20 66 69 72 73 74 20  SE if the first 
1ae60 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f  comparison is no
1ae70 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65  t NULL */.    de
1ae80 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74  stNotNull = dest
1ae90 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66  IfFalse;.  }.  f
1aea0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
1aeb0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
1aec0 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  r *p;.    CollSe
1aed0 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e  q *pColl;.    in
1aee0 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65  t r3 = sqlite3Ge
1aef0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
1af00 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
1af10 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
1af20 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20  xpr(pLeft, i);. 
1af30 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1af40 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1af50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71  arse, p);.    sq
1af60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1af70 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45  v, OP_Column, pE
1af80 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20  xpr->iTable, i, 
1af90 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r3);.    sqlite3
1afa0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1afb0 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73  _Ne, rLhs+i, des
1afc0 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20  tNotNull, r3,.  
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afe0 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
1aff0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1b000 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1b010 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
1b020 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1b030 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20  arse, r3);.  }. 
1b040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b050 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1b060 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
1b070 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29   if( nVector>1 )
1b080 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1b090 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1b0a0 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20   destNotNull);. 
1b0b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b0c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
1b0d0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1b0e0 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20  addrTop+1);.    
1b0f0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b100 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a  ..    /* Step 7:
1b110 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68    If we reach th
1b120 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
1b130 77 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  w that the resul
1b140 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  t must.    ** be
1b150 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73   false. */.    s
1b160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b170 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1b180 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1b190 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65  }..  /* Jumps he
1b1a0 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72  re in order to r
1b1b0 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20  eturn true. */. 
1b1c0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1b1d0 48 65 72 65 28 76 2c 20 61 64 64 72 54 72 75 74  Here(v, addrTrut
1b1e0 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78  hOp);..sqlite3Ex
1b1f0 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
1b200 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72  d:.  if( rLhs!=r
1b210 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65  LhsOrig ) sqlite
1b220 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1b230 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20  pParse, rLhs);. 
1b240 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1b250 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1b260 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1b270 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b  "end IN expr"));
1b280 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65  .sqlite3ExprCode
1b290 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20  IN_oom_error:.  
1b2a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1b2b0 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29  arse->db, aiMap)
1b2c0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1b2d0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41  e(pParse->db, zA
1b2e0 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ff);.}.#endif /*
1b2f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1b300 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
1b310 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1b320 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a  OATING_POINT./*.
1b330 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
1b340 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
1b350 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f  will put the flo
1b360 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
1b370 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62  alue described b
1b380 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  y z[0..n-1] into
1b390 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
1b3a0 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74  **.** The z[] st
1b3b0 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62  ring will probab
1b3c0 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74  ly not be zero-t
1b3d0 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20  erminated.  But 
1b3e0 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61  the .** z[n] cha
1b3f0 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e  racter is guaran
1b400 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74  teed to be somet
1b410 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e  hing that does n
1b420 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20  ot look.** like 
1b430 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
1b440 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a   of the number..
1b450 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
1b460 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c  odeReal(Vdbe *v,
1b470 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
1b480 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20  int negateFlag, 
1b490 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28  int iMem){.  if(
1b4a0 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b   ALWAYS(z!=0) ){
1b4b0 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75  .    double valu
1b4c0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74  e;.    sqlite3At
1b4d0 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71  oF(z, &value, sq
1b4e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
1b4f0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
1b500 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c      assert( !sql
1b510 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29  ite3IsNaN(value)
1b520 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41   ); /* The new A
1b530 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e  toF never return
1b540 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28  s NaN */.    if(
1b550 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61   negateFlag ) va
1b560 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20  lue = -value;.  
1b570 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b580 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65  Op4Dup8(v, OP_Re
1b590 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  al, 0, iMem, 0, 
1b5a0 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f  (u8*)&value, P4_
1b5b0 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  REAL);.  }.}.#en
1b5c0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  dif.../*.** Gene
1b5d0 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
1b5e0 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
1b5f0 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65  t the integer de
1b600 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78  scribe by.** tex
1b610 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  t z[0..n-1] into
1b620 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
1b630 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f  **.** Expr.u.zTo
1b640 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54  ken is always UT
1b650 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d  F8 and zero-term
1b660 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  inated..*/.stati
1b670 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67  c void codeInteg
1b680 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
1b690 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1b6a0 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20  nt negFlag, int 
1b6b0 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76  iMem){.  Vdbe *v
1b6c0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1b6d0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
1b6e0 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
1b6f0 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  ue ){.    int i 
1b700 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75  = pExpr->u.iValu
1b710 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  e;.    assert( i
1b720 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >=0 );.    if( n
1b730 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  egFlag ) i = -i;
1b740 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b750 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1b760 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a  eger, i, iMem);.
1b770 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1b780 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75   c;.    i64 valu
1b790 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1b7a0 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e  r *z = pExpr->u.
1b7b0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65  zToken;.    asse
1b7c0 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20  rt( z!=0 );.    
1b7d0 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72  c = sqlite3DecOr
1b7e0 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c  HexToI64(z, &val
1b7f0 75 65 29 3b 0a 20 20 20 20 69 66 28 20 28 63 3d  ue);.    if( (c=
1b800 3d 33 20 26 26 20 21 6e 65 67 46 6c 61 67 29 20  =3 && !negFlag) 
1b810 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e 65  || (c==2) || (ne
1b820 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d  gFlag && value==
1b830 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29  SMALLEST_INT64))
1b840 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1b850 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1b860 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
1b870 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b880 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
1b890 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
1b8a0 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
1b8b0 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64   z);.#else.#ifnd
1b8c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48  ef SQLITE_OMIT_H
1b8d0 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20  EX_INTEGER.     
1b8e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1b8f0 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d  nicmp(z,"0x",2)=
1b900 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1b910 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b920 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72  arse, "hex liter
1b930 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73  al too big: %s%s
1b940 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22  ", negFlag?"-":"
1b950 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ",z);.      }els
1b960 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
1b970 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
1b980 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c  l(v, z, negFlag,
1b990 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a   iMem);.      }.
1b9a0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1b9b0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  {.      if( negF
1b9c0 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63  lag ){ value = c
1b9d0 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  ==3 ? SMALLEST_I
1b9e0 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d  NT64 : -value; }
1b9f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ba00 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
1ba10 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65  OP_Int64, 0, iMe
1ba20 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75  m, 0, (u8*)&valu
1ba30 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1ba40 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1ba50 20 45 72 61 73 65 20 63 6f 6c 75 6d 6e 2d 63 61   Erase column-ca
1ba60 63 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72  che entry number
1ba70 20 69 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69   i.*/.static voi
1ba80 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61  d cacheEntryClea
1ba90 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1baa0 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20 70   int i){.  if( p
1bab0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1bac0 5b 69 5d 2e 74 65 6d 70 52 65 67 20 29 7b 0a 20  [i].tempReg ){. 
1bad0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1bae0 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
1baf0 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
1bb00 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eg) ){.      pPa
1bb10 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
1bb20 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
1bb30 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  ] = pParse->aCol
1bb40 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20  Cache[i].iReg;. 
1bb50 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
1bb60 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  e->nColCache--;.
1bb70 20 20 69 66 28 20 69 3c 70 50 61 72 73 65 2d 3e    if( i<pParse->
1bb80 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20  nColCache ){.   
1bb90 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1bba0 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  he[i] = pParse->
1bbb0 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65  aColCache[pParse
1bbc0 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20  ->nColCache];.  
1bbd0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
1bbe0 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
1bbf0 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
1bc00 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
1bc10 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
1bc20 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
1bc30 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
1bc40 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
1bc50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1bc60 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
1bc70 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1bc80 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
1bc90 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
1bca0 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
1bcb0 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
1bcc0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1bcd0 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  he *p;..  /* Unl
1bce0 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73  ess an error has
1bcf0 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73   occurred, regis
1bd00 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ter numbers are 
1bd10 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e  always positive.
1bd20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52   */.  assert( iR
1bd30 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  eg>0 || pParse->
1bd40 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
1bd50 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1bd60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   );.  assert( iC
1bd70 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33  ol>=-1 && iCol<3
1bd80 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69  2768 );  /* Fini
1bd90 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  te column number
1bda0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53  s */..  /* The S
1bdb0 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
1bdc0 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20  e flag disables 
1bdd0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1bde0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  .  This is used.
1bdf0 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67    ** for testing
1be00 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66   only - to verif
1be10 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c  y that SQLite al
1be20 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61  ways gets the sa
1be30 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77  me answer.  ** w
1be40 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20  ith and without 
1be50 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1be60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..  */.  if( Opt
1be70 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
1be80 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
1be90 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
1bea0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
1beb0 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20  * First replace 
1bec0 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74  any existing ent
1bed0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ry..  **.  ** Ac
1bee0 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20  tually, the way 
1bef0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1bf00 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73   is currently us
1bf10 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61  ed, we are guara
1bf20 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  nteed.  ** that 
1bf30 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  the object will 
1bf40 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65  never already be
1bf50 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69   in cache.  Veri
1bf60 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  fy this guarante
1bf70 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  e..  */.#ifndef 
1bf80 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  NDEBUG.  for(i=0
1bf90 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1bfa0 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d  Cache; i<pParse-
1bfb0 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c  >nColCache; i++,
1bfc0 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   p++){.    asser
1bfd0 74 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54  t( p->iTable!=iT
1bfe0 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e  ab || p->iColumn
1bff0 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65  !=iCol );.  }.#e
1c000 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1c010 49 54 45 5f 44 45 42 55 47 5f 43 4f 4c 55 4d 4e  ITE_DEBUG_COLUMN
1c020 43 41 43 48 45 0a 20 20 2f 2a 20 41 64 64 20 61  CACHE.  /* Add a
1c030 20 53 65 74 54 61 62 43 6f 6c 20 6f 70 63 6f 64   SetTabCol opcod
1c040 65 20 66 6f 72 20 72 75 6e 2d 74 69 6d 65 20 76  e for run-time v
1c050 65 72 69 66 69 63 61 74 69 6f 6e 20 74 68 61 74  erification that
1c060 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a   the column.  **
1c070 20 63 61 63 68 65 20 69 73 20 77 6f 72 6b 69 6e   cache is workin
1c080 67 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  g correctly..  *
1c090 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
1c0a0 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56  ddOp3(pParse->pV
1c0b0 64 62 65 2c 20 4f 50 5f 53 65 74 54 61 62 43 6f  dbe, OP_SetTabCo
1c0c0 6c 2c 20 69 54 61 62 2c 20 69 43 6f 6c 2c 20 69  l, iTab, iCol, i
1c0d0 52 65 67 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Reg);.#endif..  
1c0e0 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
1c0f0 69 73 20 61 6c 72 65 61 64 79 20 66 75 6c 6c 2c  is already full,
1c100 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61 73   delete the leas
1c110 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20  t recently used 
1c120 65 6e 74 72 79 20 2a 2f 0a 20 20 69 66 28 20 70  entry */.  if( p
1c130 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1c140 3e 3d 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  >=SQLITE_N_COLCA
1c150 43 48 45 20 29 7b 0a 20 20 20 20 6d 69 6e 4c 72  CHE ){.    minLr
1c160 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a  u = 0x7fffffff;.
1c170 20 20 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b      idxLru = -1;
1c180 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  .    for(i=0, p=
1c190 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1c1a0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
1c1b0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
1c1c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1c1d0 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20  lru<minLru ){.  
1c1e0 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69        idxLru = i
1c1f0 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 4c 72 75  ;.        minLru
1c200 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 20   = p->lru;.     
1c210 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d   }.    }.    p =
1c220 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61   &pParse->aColCa
1c230 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 7d  che[idxLru];.  }
1c240 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 26 70  else{.    p = &p
1c250 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1c260 5b 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  [pParse->nColCac
1c270 68 65 2b 2b 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  he++];.  }..  /*
1c280 20 41 64 64 20 74 68 65 20 6e 65 77 20 65 6e 74   Add the new ent
1c290 72 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ry to the end of
1c2a0 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
1c2b0 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72  p->iLevel = pPar
1c2c0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
1c2d0 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69  .  p->iTable = i
1c2e0 54 61 62 3b 0a 20 20 70 2d 3e 69 43 6f 6c 75 6d  Tab;.  p->iColum
1c2f0 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 70 2d 3e 69  n = iCol;.  p->i
1c300 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 2d  Reg = iReg;.  p-
1c310 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
1c320 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
1c330 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 7d 0a  >iCacheCnt++;.}.
1c340 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20  ./*.** Indicate 
1c350 74 68 61 74 20 72 65 67 69 73 74 65 72 73 20 62  that registers b
1c360 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65  etween iReg..iRe
1c370 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69  g+nReg-1 are bei
1c380 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
1c390 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72 61 6e  ** Purge the ran
1c3a0 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
1c3b0 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20  from the column 
1c3c0 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cache..*/.void s
1c3d0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
1c3e0 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61  emove(Parse *pPa
1c3f0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
1c400 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
1c410 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  i = 0;.  while( 
1c420 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1c430 63 68 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  che ){.    struc
1c440 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 20 3d  t yColCache *p =
1c450 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61   &pParse->aColCa
1c460 63 68 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  che[i];.    if( 
1c470 70 2d 3e 69 52 65 67 20 3e 3d 20 69 52 65 67 20  p->iReg >= iReg 
1c480 26 26 20 70 2d 3e 69 52 65 67 20 3c 20 69 52 65  && p->iReg < iRe
1c490 67 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20  g+nReg ){.      
1c4a0 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
1c4b0 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20  pParse, i);.    
1c4c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b  }else{.      i++
1c4d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1c4e0 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
1c4f0 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e  e current column
1c500 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20   cache context. 
1c510 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73   Any new entries
1c520 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20   added.** added 
1c530 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  to the column ca
1c540 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63  che after this c
1c550 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20  all are removed 
1c560 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72  when the.** corr
1c570 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63  esponding pop oc
1c580 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
1c590 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1c5a0 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
1c5b0 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61  ){.  pParse->iCa
1c5c0 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64  cheLevel++;.#ifd
1c5d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c5e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
1c5f0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1c600 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
1c610 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
1c620 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50  USH to %d\n", pP
1c630 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1c640 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  l);.  }.#endif.}
1c650 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66  ../*.** Remove f
1c660 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
1c670 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73  ache any entries
1c680 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64   that were added
1c690 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68   since the.** th
1c6a0 65 20 70 72 65 76 69 6f 75 73 20 73 71 6c 69 74  e previous sqlit
1c6b0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 20  e3ExprCachePush 
1c6c0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f  operation.  In o
1c6d0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74  ther words, rest
1c6e0 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ore.** the cache
1c6f0 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74   to the state it
1c700 20 77 61 73 20 69 6e 20 70 72 69 6f 72 20 74 68   was in prior th
1c710 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 50 75  e most recent Pu
1c720 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  sh..*/.void sqli
1c730 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1c740 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1c750 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 61    int i = 0;.  a
1c760 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69  ssert( pParse->i
1c770 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b  CacheLevel>=1 );
1c780 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
1c790 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66  eLevel--;.#ifdef
1c7a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1c7b0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
1c7c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
1c7d0 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
1c7e0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50  .    printf("POP
1c7f0 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72    to %d\n", pPar
1c800 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29  se->iCacheLevel)
1c810 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77  ;.  }.#endif.  w
1c820 68 69 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e  hile( i<pParse->
1c830 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20  nColCache ){.   
1c840 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f   if( pParse->aCo
1c850 6c 43 61 63 68 65 5b 69 5d 2e 69 4c 65 76 65 6c  lCache[i].iLevel
1c860 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
1c870 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61  evel ){.      ca
1c880 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
1c890 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 65  arse, i);.    }e
1c8a0 6c 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  lse{.      i++;.
1c8b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1c8c0 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65 64  ** When a cached
1c8d0 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65   column is reuse
1c8e0 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  d, make sure tha
1c8f0 74 20 69 74 73 20 72 65 67 69 73 74 65 72 20 69  t its register i
1c900 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61  s.** no longer a
1c910 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65  vailable as a te
1c920 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20 74 69  mp register.  ti
1c930 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68 61  cket #3879:  tha
1c940 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74  t same.** regist
1c950 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74  er might be in t
1c960 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74  he cache in mult
1c970 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20  iple places, so 
1c980 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65  be sure to.** ge
1c990 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73  t them all..*/.s
1c9a0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1c9b0 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
1c9c0 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70 50  gister(Parse *pP
1c9d0 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
1c9e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1c9f0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
1ca00 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
1ca10 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1ca20 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
1ca30 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ache; i++, p++){
1ca40 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
1ca50 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
1ca60 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
1ca70 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20      }.  }.}../* 
1ca80 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1ca90 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74  at will load int
1caa0 6f 20 72 65 67 69 73 74 65 72 20 72 65 67 4f 75  o register regOu
1cab0 74 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69  t a value that i
1cac0 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65  s.** appropriate
1cad0 20 66 6f 72 20 74 68 65 20 69 49 64 78 43 6f 6c   for the iIdxCol
1cae0 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  -th column of in
1caf0 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69  dex pIdx..*/.voi
1cb00 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1cb10 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e  eLoadIndexColumn
1cb20 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1cb30 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69  e,  /* The parsi
1cb40 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1cb50 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
1cb60 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
1cb70 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20  se column is to 
1cb80 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69  be loaded */.  i
1cb90 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f  nt iTabCur,    /
1cba0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
1cbb0 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72 6f 77  g to a table row
1cbc0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 6f   */.  int iIdxCo
1cbd0 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c  l,    /* The col
1cbe0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1cbf0 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f   to be loaded */
1cc00 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
1cc10 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
1cc20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c  index column val
1cc30 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
1cc40 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20  ter */.){.  i16 
1cc50 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  iTabCol = pIdx->
1cc60 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c  aiColumn[iIdxCol
1cc70 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43 6f 6c  ];.  if( iTabCol
1cc80 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20  ==XN_EXPR ){.   
1cc90 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1cca0 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20 20 61  ColExpr );.    a
1ccb0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f  ssert( pIdx->aCo
1ccc0 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64  lExpr->nExpr>iId
1ccd0 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61 72  xCol );.    pPar
1cce0 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69  se->iSelfTab = i
1ccf0 54 61 62 43 75 72 20 2b 20 31 3b 0a 20 20 20 20  TabCur + 1;.    
1cd00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
1cd10 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  opy(pParse, pIdx
1cd20 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49  ->aColExpr->a[iI
1cd30 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65  dxCol].pExpr, re
1cd40 67 4f 75 74 29 3b 0a 20 20 20 20 70 50 61 72 73  gOut);.    pPars
1cd50 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b  e->iSelfTab = 0;
1cd60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1cd70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1cd80 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50  ColumnOfTable(pP
1cd90 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64  arse->pVdbe, pId
1cda0 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43  x->pTable, iTabC
1cdb0 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur,.            
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 20 20 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c          iTabCol,
1cde0 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a   regOut);.  }.}.
1cdf0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1ce00 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20  code to extract 
1ce10 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1ce20 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
1ce30 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  of a table..*/.v
1ce40 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1ce50 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
1ce60 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ble(.  Vdbe *v, 
1ce70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
1ce80 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  BE under constru
1ce90 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65  ction */.  Table
1cea0 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68   *pTab,    /* Th
1ceb0 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
1cec0 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a  ng the value */.
1ced0 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
1cee0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
1cef0 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50  ursor.  Or the P
1cf00 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54  K cursor for WIT
1cf10 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20  HOUT ROWID */.  
1cf20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
1cf30 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1cf40 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63  column to extrac
1cf50 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  t */.  int regOu
1cf60 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63  t      /* Extrac
1cf70 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f  t the value into
1cf80 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
1cf90 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54 61 62 3d  /.){.  if( pTab=
1cfa0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1cfb0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1cfc0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75  P_Column, iTabCu
1cfd0 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29  r, iCol, regOut)
1cfe0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1cff0 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c  }.  if( iCol<0 |
1d000 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50  | iCol==pTab->iP
1d010 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
1d020 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d030 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75  OP_Rowid, iTabCu
1d040 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65  r, regOut);.  }e
1d050 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  lse{.    int op 
1d060 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  = IsVirtual(pTab
1d070 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a  ) ? OP_VColumn :
1d080 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   OP_Column;.    
1d090 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20  int x = iCol;.  
1d0a0 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
1d0b0 70 54 61 62 29 20 26 26 20 21 49 73 56 69 72 74  pTab) && !IsVirt
1d0c0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
1d0d0 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f     x = sqlite3Co
1d0e0 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69  lumnOfIndex(sqli
1d0f0 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
1d100 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b  ex(pTab), iCol);
1d110 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d120 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1d130 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20  op, iTabCur, x, 
1d140 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69  regOut);.  }.  i
1d150 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
1d160 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44    sqlite3ColumnD
1d170 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20  efault(v, pTab, 
1d180 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
1d190 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1d1a0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1d1b0 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20  ill extract the 
1d1c0 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
1d1d0 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20  n from.** table 
1d1e0 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74  pTab and store t
1d1f0 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
1d200 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 0a  in a register. .
1d210 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20  **.** An effort 
1d220 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65  is made to store
1d230 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
1d240 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  e in register iR
1d250 65 67 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  eg.  This.** is 
1d260 6e 6f 74 20 67 61 72 61 6e 74 65 65 65 64 20 66  not garanteeed f
1d270 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d  or GetColumn() -
1d280 20 74 68 65 20 72 65 73 75 6c 74 20 63 61 6e 20   the result can 
1d290 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  be stored in.** 
1d2a0 61 6e 79 20 72 65 67 69 73 74 65 72 2e 20 20 42  any register.  B
1d2b0 75 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ut the result is
1d2c0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
1d2d0 61 6e 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  and in register 
1d2e0 69 52 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43  iReg.** for GetC
1d2f0 6f 6c 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a  olumnToReg()..**
1d300 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
1d310 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  e an open cursor
1d320 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62   to pTab in iTab
1d330 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
1d340 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
1d350 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30  d.  If iColumn<0
1d360 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65   then code is ge
1d370 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74  nerated that ext
1d380 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e  racts the rowid.
1d390 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
1d3a0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1d3b0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1d3c0 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
1d3d0 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1d3e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d3f0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
1d400 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1d410 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
1d420 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f   are reading fro
1d430 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  m */.  int iColu
1d440 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  mn,     /* Index
1d450 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
1d460 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  lumn */.  int iT
1d470 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  able,      /* Th
1d480 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
1d490 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  g to the table *
1d4a0 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20  /.  int iReg,   
1d4b0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65       /* Store re
1d4c0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
1d4d0 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20  u8 p5           
1d4e0 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72   /* P5 value for
1d4f0 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41   OP_Column + FLA
1d500 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  GS */.){.  Vdbe 
1d510 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1d520 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
1d530 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1d540 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *p;..  for(i=0, 
1d550 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1d560 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  che; i<pParse->n
1d570 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70  ColCache; i++, p
1d580 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
1d590 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
1d5a0 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43  & p->iColumn==iC
1d5b0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70  olumn ){.      p
1d5c0 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
1d5d0 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
1d5e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1d5f0 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 70  chePinRegister(p
1d600 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b  Parse, p->iReg);
1d610 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1d620 45 42 55 47 5f 43 4f 4c 55 4d 4e 43 41 43 48 45  EBUG_COLUMNCACHE
1d630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d640 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56  beAddOp3(v, OP_V
1d650 65 72 69 66 79 54 61 62 43 6f 6c 2c 20 69 54 61  erifyTabCol, iTa
1d660 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 70 2d  ble, iColumn, p-
1d670 3e 69 52 65 67 29 3b 0a 23 65 6e 64 69 66 0a 20  >iReg);.#endif. 
1d680 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
1d690 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  Reg;.    }.  }  
1d6a0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
1d6b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1d6c0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1d6d0 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54  able(v, pTab, iT
1d6e0 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
1d6f0 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29  Reg);.  if( p5 )
1d700 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1d710 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29  eChangeP5(v, p5)
1d720 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20  ;.  }else{   .  
1d730 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1d740 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1d750 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
1d760 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65   iReg);.  }.  re
1d770 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69  turn iReg;.}.voi
1d780 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1d790 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28  eGetColumnToReg(
1d7a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1d7b0 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
1d7c0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1d7d0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1d7e0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1d7f0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1d800 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
1d810 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
1d820 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
1d830 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
1d840 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1d850 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
1d860 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
1d870 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
1d880 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
1d890 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20  .  int iReg     
1d8a0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
1d8b0 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
1d8c0 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
1d8d0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1d8e0 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
1d8f0 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c  , iColumn, iTabl
1d900 65 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69  e, iReg, 0);.  i
1d910 66 28 20 72 31 21 3d 69 52 65 67 20 29 20 73 71  f( r1!=iReg ) sq
1d920 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d930 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1d940 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65  P_SCopy, r1, iRe
1d950 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c  g);.}.../*.** Cl
1d960 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
1d970 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  ache entries..*/
1d980 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1d990 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73  rCacheClear(Pars
1d9a0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
1d9b0 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  t i;..#ifdef SQL
1d9c0 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1d9d0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
1d9e0 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
1d9f0 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
1da00 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e   printf("CLEAR\n
1da10 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
1da20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
1da30 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1da40 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
1da50 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1da60 5d 2e 74 65 6d 70 52 65 67 0a 20 20 20 20 20 26  ].tempReg.     &
1da70 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  & pParse->nTempR
1da80 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
1da90 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 0a 20  rse->aTempReg). 
1daa0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 70 50 61     ){.       pPa
1dab0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
1dac0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
1dad0 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  ] = pParse->aCol
1dae0 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20  Cache[i].iReg;. 
1daf0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
1db00 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20 30  e->nColCache = 0
1db10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  ;.}../*.** Recor
1db20 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
1db30 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  an affinity chan
1db40 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  ge has occurred 
1db50 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67  on iCount.** reg
1db60 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
1db70 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a  with iStart..*/.
1db80 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1db90 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1dba0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
1dbb0 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69  e, int iStart, i
1dbc0 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71  nt iCount){.  sq
1dbd0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1dbe0 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74  move(pParse, iSt
1dbf0 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a  art, iCount);.}.
1dc00 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1dc10 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e  code to move con
1dc20 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
1dc30 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
1dc40 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
1dc50 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
1dc60 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f  g-1. Keep the co
1dc70 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f  lumn cache up-to
1dc80 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  -date..*/.void s
1dc90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
1dca0 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
1dcb0 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
1dcc0 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b   iTo, int nReg){
1dcd0 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d  .  assert( iFrom
1dce0 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46  >=iTo+nReg || iF
1dcf0 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b  rom+nReg<=iTo );
1dd00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1dd10 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
1dd20 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
1dd30 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
1dd40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1dd50 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
1dd60 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d   iFrom, nReg);.}
1dd70 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1dd80 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1dd90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f  efined(SQLITE_CO
1dda0 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a  VERAGE_TEST)./*.
1ddb0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1ddc0 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69  f any register i
1ddd0 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f  n the range iFro
1dde0 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76  m..iTo (inclusiv
1ddf0 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73  e).** is used as
1de00 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c   part of the col
1de10 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  umn cache..**.**
1de20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1de30 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73   used within ass
1de40 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61  ert() and testca
1de50 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79  se() macros only
1de60 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  .** and does not
1de70 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72   appear in a nor
1de80 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74  mal build..*/.st
1de90 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43  atic int usedAsC
1dea0 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65  olumnCache(Parse
1deb0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
1dec0 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
1ded0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1dee0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
1def0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1df00 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1df10 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1df20 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  he; i++, p++){. 
1df30 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52     int r = p->iR
1df40 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69  eg;.    if( r>=i
1df50 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29  From && r<=iTo )
1df60 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a   return 1;    /*
1df70 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20  NO_TEST*/.  }.  
1df80 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1df90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
1dfa0 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56  UG || SQLITE_COV
1dfb0 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a  ERAGE_TEST */...
1dfc0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1dfd0 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
1dfe0 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52  n node to a TK_R
1dff0 45 47 49 53 54 45 52 20 72 65 66 65 72 65 6e 63  EGISTER referenc
1e000 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  ing.** register 
1e010 69 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65  iReg.  The calle
1e020 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
1e030 61 74 20 69 52 65 67 20 61 6c 72 65 61 64 79 20  at iReg already 
1e040 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
1e050 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1e060 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
1e070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e080 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
1e090 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65  Expr *p, int iRe
1e0a0 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70  g){.  p->op2 = p
1e0b0 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20  ->op;.  p->op = 
1e0c0 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70  TK_REGISTER;.  p
1e0d0 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b  ->iTable = iReg;
1e0e0 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70  .  ExprClearProp
1e0f0 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29  erty(p, EP_Skip)
1e100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75  ;.}../*.** Evalu
1e110 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
1e120 6e 20 28 65 69 74 68 65 72 20 61 20 76 65 63 74  n (either a vect
1e130 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65  or or a scalar e
1e140 78 70 72 65 73 73 69 6f 6e 29 20 61 6e 64 20 73  xpression) and s
1e150 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75  tore.** the resu
1e160 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75  lt in continguou
1e170 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1e180 73 74 65 72 73 2e 20 20 52 65 74 75 72 6e 20 74  sters.  Return t
1e190 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
1e1a0 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
1e1b0 72 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  r used to store 
1e1c0 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
1e1d0 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65  * If the returne
1e1e0 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  d result registe
1e1f0 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
1e200 20 73 63 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c   scalar, then al
1e210 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74 68 61 74  so write.** that
1e220 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1e230 20 69 6e 74 6f 20 2a 70 69 46 72 65 65 61 62 6c   into *piFreeabl
1e240 65 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  e.  If the retur
1e250 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69 73  ned result regis
1e260 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20  ter.** is not a 
1e270 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 66 20  temporary or if 
1e280 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1e290 73 20 61 20 76 65 63 74 6f 72 20 73 65 74 20 2a  s a vector set *
1e2a0 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f  piFreeable.** to
1e2b0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
1e2c0 74 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  t exprCodeVector
1e2d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e2e0 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69  Expr *p, int *pi
1e2f0 46 72 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74  Freeable){.  int
1e300 20 69 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20   iResult;.  int 
1e310 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  nResult = sqlite
1e320 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
1e330 70 29 3b 0a 20 20 69 66 28 20 6e 52 65 73 75 6c  p);.  if( nResul
1e340 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 52 65 73  t==1 ){.    iRes
1e350 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ult = sqlite3Exp
1e360 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e370 2c 20 70 2c 20 70 69 46 72 65 65 61 62 6c 65 29  , p, piFreeable)
1e380 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
1e390 70 69 46 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a  piFreeable = 0;.
1e3a0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
1e3b0 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 23 69 66 20  K_SELECT ){.#if 
1e3c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1e3d0 55 45 52 59 0a 20 20 20 20 20 20 69 52 65 73 75  UERY.      iResu
1e3e0 6c 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20  lt = 0;.#else.  
1e3f0 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71      iResult = sq
1e400 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
1e410 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 30 2c  ct(pParse, p, 0,
1e420 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
1e430 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1e440 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c   i;.      iResul
1e450 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
1e460 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  +1;.      pParse
1e470 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
1e480 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  t;.      for(i=0
1e490 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b  ; i<nResult; i++
1e4a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e4b0 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72  e3ExprCodeFactor
1e4c0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  able(pParse, p->
1e4d0 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
1e4e0 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b  xpr, i+iResult);
1e4f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e500 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73   }.  return iRes
1e510 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ult;.}.../*.** G
1e520 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
1e530 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
1e540 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
1e550 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
1e560 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
1e570 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
1e580 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
1e590 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
1e5a0 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
1e5b0 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
1e5c0 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
1e5d0 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
1e5e0 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
1e5f0 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
1e600 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
1e610 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
1e620 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
1e630 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
1e640 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
1e650 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
1e660 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
1e670 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
1e680 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
1e690 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
1e6a0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
1e6b0 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
1e6c0 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
1e6d0 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
1e6e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1e6f0 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
1e700 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1e710 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1e720 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
1e730 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
1e740 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
1e750 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1e760 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e780 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
1e790 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1e7a0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
1e7b0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
1e7c0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
1e7d0 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
1e7e0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1e7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
1e800 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
1e810 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1e820 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
1e830 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
1e840 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1e850 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1e860 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1e870 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  */.  int r1, r2;
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e890 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
1e8a0 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
1e8b0 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20  Expr tempX;     
1e8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
1e8d0 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  porary expressio
1e8e0 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n node */.  int 
1e8f0 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  p5 = 0;..  asser
1e900 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
1e910 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
1e920 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  Mem );.  if( v==
1e930 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
1e940 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1e950 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1e960 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1e970 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72  expr_code_doover
1e980 3a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  :.  if( pExpr==0
1e990 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f   ){.    op = TK_
1e9a0 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
1e9b0 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
1e9c0 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  p;.  }.  switch(
1e9d0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1e9e0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
1e9f0 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
1ea00 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72  pAggInfo = pExpr
1ea10 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
1ea20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1ea30 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41  _col *pCol = &pA
1ea40 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78  ggInfo->aCol[pEx
1ea50 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20  pr->iAgg];.     
1ea60 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e   if( !pAggInfo->
1ea70 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20  directMode ){.  
1ea80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1ea90 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20  ol->iMem>0 );.  
1eaa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f        return pCo
1eab0 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  l->iMem;.      }
1eac0 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66  else if( pAggInf
1ead0 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  o->useSortingIdx
1eae0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1eaf0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1eb00 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67   OP_Column, pAgg
1eb10 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78  Info->sortingIdx
1eb20 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  PTab,.          
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
1eb50 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  rColumn, target)
1eb60 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1eb70 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
1eb80 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
1eb90 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
1eba0 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
1ebb0 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
1ebc0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
1ebd0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  MN: {.      int 
1ebe0 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54  iTab = pExpr->iT
1ebf0 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20  able;.      if( 
1ec00 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ec10 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43  pExpr, EP_FixedC
1ec20 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ol) ){.        r
1ec30 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
1ec40 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1ec50 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ec60 2c 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  ,target);.      
1ec70 7d 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62  }.      if( iTab
1ec80 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  <0 ){.        if
1ec90 28 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54  ( pParse->iSelfT
1eca0 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
1ecb0 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
1ecc0 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
1ecd0 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69  s or inserting i
1ece0 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65  nto partial inde
1ecf0 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  x */.          r
1ed00 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f  eturn pExpr->iCo
1ed10 6c 75 6d 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69  lumn - pParse->i
1ed20 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20  SelfTab;.       
1ed30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ed40 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65    /* Coding an e
1ed50 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
1ed60 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64  s part of an ind
1ed70 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20  ex where column 
1ed80 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20  names.          
1ed90 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ** in the index 
1eda0 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61 62  refer to the tab
1edb0 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  le to which the 
1edc0 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f  index belongs */
1edd0 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62 20  .          iTab 
1ede0 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54  = pParse->iSelfT
1edf0 61 62 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ab - 1;.        
1ee00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1ee10 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
1ee20 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1ee30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ee40 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee60 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
1ee70 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74  mn, iTab, target
1ee80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eea0 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20   pExpr->op2);.  
1eeb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1eec0 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
1eed0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1eee0 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
1eef0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1ef00 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1ef10 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
1ef20 52 55 45 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20  RUEFALSE: {.    
1ef30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ef40 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1ef50 72 2c 20 73 71 6c 69 74 65 33 45 78 70 72 54 72  r, sqlite3ExprTr
1ef60 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 29 2c  uthValue(pExpr),
1ef70 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1ef80 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1ef90 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1efa0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1efb0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65  G_POINT.    case
1efc0 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
1efd0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1efe0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1eff0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1f000 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61  );.      codeRea
1f010 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  l(v, pExpr->u.zT
1f020 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29  oken, 0, target)
1f030 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1f040 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
1f050 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1f060 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
1f070 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1f080 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1f090 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1f0a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f0b0 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74  eLoadString(v, t
1f0c0 61 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e  arget, pExpr->u.
1f0d0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72  zToken);.      r
1f0e0 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1f0f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f100 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
1f110 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f120 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
1f130 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1f140 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1f150 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1f160 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
1f170 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
1f180 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
1f190 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t n;.      const
1f1a0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
1f1b0 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20  char *zBlob;.   
1f1c0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1f1d0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1f1e0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1f1f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f200 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1f210 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70  [0]=='x' || pExp
1f220 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1f230 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'X' );.      ass
1f240 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1f250 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b  oken[1]=='\'' );
1f260 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70  .      z = &pExp
1f270 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a  r->u.zToken[2];.
1f280 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
1f290 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31  3Strlen30(z) - 1
1f2a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f2b0 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  z[n]=='\'' );.  
1f2c0 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69      zBlob = sqli
1f2d0 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c  te3HexToBlob(sql
1f2e0 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a  ite3VdbeDb(v), z
1f2f0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
1f300 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1f310 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74   OP_Blob, n/2, t
1f320 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c  arget, 0, zBlob,
1f330 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1f340 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1f350 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
1f360 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
1f370 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  ABLE: {.      as
1f380 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1f390 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1f3a0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1f3b0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1f3c0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
1f3d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f3e0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1f3f0 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  0]!=0 );.      s
1f400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f410 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c  (v, OP_Variable,
1f420 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1f430 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1f440 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  if( pExpr->u.zTo
1f450 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20  ken[1]!=0 ){.   
1f460 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1f470 2a 7a 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73  *z = sqlite3VLis
1f480 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73  tNumToName(pPars
1f490 65 2d 3e 70 56 4c 69 73 74 2c 20 70 45 78 70 72  e->pVList, pExpr
1f4a0 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1f4b0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1f4c0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1f4d0 27 3f 27 20 7c 7c 20 73 74 72 63 6d 70 28 70 45  '?' || strcmp(pE
1f4e0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a  xpr->u.zToken, z
1f4f0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1f500 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30  pParse->pVList[0
1f510 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61  ] = 0; /* Indica
1f520 74 65 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20  te VList may no 
1f530 6c 6f 6e 67 65 72 20 62 65 20 65 6e 6c 61 72 67  longer be enlarg
1f540 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ed */.        sq
1f550 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
1f560 34 28 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50  4(v, (char*)z, P
1f570 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
1f580 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1f590 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
1f5a0 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
1f5b0 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
1f5c0 72 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  rn pExpr->iTable
1f5d0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1f5e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1f5f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
1f600 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
1f610 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
1f620 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
1f630 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
1f640 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
1f650 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1f660 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1f670 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
1f680 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  t);.      if( in
1f690 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20  Reg!=target ){. 
1f6a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f6b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1f6c0 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
1f6d0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  get);.        in
1f6e0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
1f6f0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1f700 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f710 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74   OP_Cast, target
1f720 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f730 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f740 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45  3AffinityType(pE
1f750 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
1f760 29 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ));.      testca
1f770 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  se( usedAsColumn
1f780 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e  Cache(pParse, in
1f790 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20  Reg, inReg) );. 
1f7a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f7b0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1f7c0 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  nge(pParse, inRe
1f7d0 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 65 74  g, 1);.      ret
1f7e0 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d  urn inReg;.    }
1f7f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1f800 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
1f810 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
1f820 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
1f830 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  :.      op = (op
1f840 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
1f850 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
1f860 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  p5 = SQLITE_NULL
1f870 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c  EQ;.      /* fal
1f880 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l-through */.   
1f890 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1f8a0 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1f8b0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1f8c0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1f8d0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1f8e0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1f8f0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1f900 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
1f910 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1f920 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
1f930 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
1f940 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61   codeVectorCompa
1f950 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1f960 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35  , target, op, p5
1f970 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1f980 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1f990 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f9a0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1f9b0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f9c0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1f9d0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f9e0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1f9f0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1fa00 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70          codeComp
1fa10 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
1fa20 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1fa30 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1fa40 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
1fa50 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
1fa60 7c 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61  | p5);.        a
1fa70 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
1fa80 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
1fa90 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
1faa0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1fab0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Lt);.        a
1fac0 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
1fad0 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
1fae0 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
1faf0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1fb00 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Le);.        a
1fb10 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
1fb20 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
1fb30 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
1fb40 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1fb50 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Gt);.        a
1fb60 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
1fb70 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
1fb80 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
1fb90 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1fba0 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Ge);.        a
1fbb0 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
1fbc0 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
1fbd0 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f  ==OP_Eq); VdbeCo
1fbe0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1fbf0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Eq);.        a
1fc00 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
1fc10 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
1fc20 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
1fc30 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1fc40 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74  P_Ne);.        t
1fc50 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fc60 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
1fc70 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fc80 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
1fc90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fca0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1fcb0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
1fcc0 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
1fcd0 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
1fce0 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
1fcf0 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
1fd00 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
1fd10 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
1fd20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1fd30 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
1fd40 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
1fd50 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
1fd60 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
1fd70 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
1fd80 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
1fd90 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41  rt( TK_AND==OP_A
1fda0 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  nd );           
1fdb0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fdc0 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  K_AND );.      a
1fdd0 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
1fde0 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20  _Or );          
1fdf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1fe00 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
1fe10 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
1fe20 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20  ==OP_Add );     
1fe30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fe40 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20  op==TK_PLUS );. 
1fe50 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1fe60 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
1fe70 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61  ct );     testca
1fe80 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53  se( op==TK_MINUS
1fe90 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1fea0 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
1feb0 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74  ainder );      t
1fec0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fed0 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  REM );.      ass
1fee0 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
1fef0 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20  OP_BitAnd );    
1ff00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ff10 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
1ff20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1ff30 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
1ff40 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ff50 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
1ff60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ff70 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76  TK_SLASH==OP_Div
1ff80 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73  ide );       tes
1ff90 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c  tcase( op==TK_SL
1ffa0 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ASH );.      ass
1ffb0 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d  ert( TK_LSHIFT==
1ffc0 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20  OP_ShiftLeft ); 
1ffd0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ffe0 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_LSHIFT );.   
1fff0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
20000 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
20010 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65  ght );  testcase
20020 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20  ( op==TK_RSHIFT 
20030 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20040 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
20050 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65  oncat );      te
20060 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43  stcase( op==TK_C
20070 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72  ONCAT );.      r
20080 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
20090 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
200a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
200b0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
200c0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
200d0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
200e0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
200f0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
20100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20110 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72  Op3(v, op, r2, r
20120 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
20130 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
20140 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
20150 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
20160 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
20170 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
20180 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
20190 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
201a0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
201b0 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eft;.      asser
201c0 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  t( pLeft );.    
201d0 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
201e0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
201f0 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
20200 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  er(pParse, pLeft
20210 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
20220 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
20230 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  get;.#ifndef SQL
20240 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
20250 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65  G_POINT.      }e
20260 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
20270 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
20280 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
20290 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
202a0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
202b0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ue) );.        c
202c0 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74  odeReal(v, pLeft
202d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74  ->u.zToken, 1, t
202e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
202f0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23  return target;.#
20300 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
20310 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  e{.        tempX
20320 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52  .op = TK_INTEGER
20330 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
20340 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61  flags = EP_IntVa
20350 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  lue|EP_TokenOnly
20360 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
20370 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  u.iValue = 0;.  
20380 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
20390 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
203a0 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
203b0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
203c0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
203d0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
203e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
203f0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
20400 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20410 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
20420 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20  btract, r2, r1, 
20430 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
20440 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
20450 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
20460 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
20470 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
20480 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
20490 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
204a0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
204b0 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
204c0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
204d0 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
204e0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
204f0 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20  NOT==OP_Not );  
20500 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20510 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20   op==TK_NOT );. 
20520 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
20530 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
20540 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
20550 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
20560 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20570 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
20580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20590 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
205a0 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
205b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
205c0 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
205d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72  {.      int isTr
205e0 75 65 3b 20 20 20 20 2f 2a 20 49 53 20 54 52 55  ue;    /* IS TRU
205f0 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45  E or IS NOT TRUE
20600 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 4e   */.      int bN
20610 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54  ormal;   /* IS T
20620 52 55 45 20 6f 72 20 49 53 20 46 41 4c 53 45 20  RUE or IS FALSE 
20630 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  */.      r1 = sq
20640 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
20650 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
20660 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
20670 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
20680 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
20690 29 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20  );.      isTrue 
206a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  = sqlite3ExprTru
206b0 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70  thValue(pExpr->p
206c0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 62 4e  Right);.      bN
206d0 6f 72 6d 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f  ormal = pExpr->o
206e0 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20  p2==TK_IS;.     
206f0 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75   testcase( isTru
20700 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20  e && bNormal);. 
20710 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
20720 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61  isTrue && bNorma
20730 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
20740 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
20750 2c 20 4f 50 5f 49 73 54 72 75 65 2c 20 72 31 2c  , OP_IsTrue, r1,
20760 20 69 6e 52 65 67 2c 20 21 69 73 54 72 75 65 2c   inReg, !isTrue,
20770 20 69 73 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61   isTrue ^ bNorma
20780 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
20790 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
207a0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
207b0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
207c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
207d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
207e0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
207f0 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
20800 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
20810 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
20820 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
20830 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
20840 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
20850 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
20860 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20870 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
20880 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
20890 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
208a0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
208b0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
208c0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
208d0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
208e0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
208f0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
20900 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
20910 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
20920 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
20930 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
20940 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
20950 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
20960 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  TNULL);.      sq
20970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20980 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
20990 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
209a0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
209b0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
209c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
209d0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
209e0 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
209f0 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
20a00 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
20a10 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
20a20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
20a30 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
20a40 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20a50 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
20a60 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
20a70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
20a80 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
20a90 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
20aa0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
20ab0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
20ac0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
20ad0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
20ae0 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
20af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
20b00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20b10 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
20b20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
20b30 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
20b40 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
20b50 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
20b60 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b        int nFarg;
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b80 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69  Number of functi
20b90 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
20ba0 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
20bb0 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Def;         /* 
20bc0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  The function def
20bd0 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  inition object *
20be0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
20bf0 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f  ar *zId;       /
20c00 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
20c10 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  ame */.      u32
20c20 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20   constMask = 0; 
20c30 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66      /* Mask of f
20c40 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
20c50 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74  s that are const
20c60 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ant */.      int
20c70 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
20c80 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
20c90 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ter */.      sql
20ca0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
20cb0 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
20cc0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
20cd0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  on */.      u8 e
20ce0 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20  nc = ENC(db);   
20cf0 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
20d00 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20  ncoding used by 
20d10 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
20d20 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
20d30 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a  pColl = 0;    /*
20d40 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   A collating seq
20d50 75 65 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65  uence */..#ifnde
20d60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
20d70 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69  NDOWFUNC.      i
20d80 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
20d90 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
20da0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
20db0 65 64 29 20 26 26 20 70 45 78 70 72 2d 3e 70 57  ed) && pExpr->pW
20dc0 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  in ){.        re
20dd0 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 57 69 6e  turn pExpr->pWin
20de0 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20  ->regResult;.   
20df0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
20e00 20 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74     if( ConstFact
20e10 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20  orOk(pParse) && 
20e20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
20e30 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78  stantNotJoin(pEx
20e40 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
20e50 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  * SQL functions 
20e60 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65  can be expensive
20e70 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65  . So try to move
20e80 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69   constant functi
20e90 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ons.        ** o
20ea0 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  ut of the inner 
20eb0 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68  loop, even if th
20ec0 61 74 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72  at means an extr
20ed0 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20  a OP_Copy. */.  
20ee0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
20ef0 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
20f00 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
20f10 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , -1);.      }. 
20f20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
20f30 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
20f40 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
20f50 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
20f60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20f70 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
20f80 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
20f90 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20  pFarg = 0;.     
20fa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20fb0 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78  pFarg = pExpr->x
20fc0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  .pList;.      }.
20fd0 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46        nFarg = pF
20fe0 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78  arg ? pFarg->nEx
20ff0 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73  pr : 0;.      as
21000 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
21010 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21020 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
21030 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d      zId = pExpr-
21040 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
21050 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
21060 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
21070 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  zId, nFarg, enc,
21080 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
21090 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57  TE_ENABLE_UNKNOW
210a0 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20  N_SQL_FUNCTION. 
210b0 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
210c0 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c   && pParse->expl
210d0 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ain ){.        p
210e0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
210f0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75  dFunction(db, "u
21100 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20  nknown", nFarg, 
21110 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  enc, 0);.      }
21120 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
21130 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65  ( pDef==0 || pDe
21140 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20  f->xFinalize!=0 
21150 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21160 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
21170 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63  e, "unknown func
21180 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64  tion: %s()", zId
21190 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
211a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
211b0 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69   /* Attempt a di
211c0 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rect implementat
211d0 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74  ion of the built
211e0 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61  -in COALESCE() a
211f0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55  nd.      ** IFNU
21200 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  LL() functions. 
21210 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e   This avoids unn
21220 65 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74  ecessary evaluat
21230 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ion of.      ** 
21240 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74  arguments past t
21250 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c  he first non-NUL
21260 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  L argument..    
21270 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
21280 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
21290 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41   SQLITE_FUNC_COA
212a0 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20  LESCE ){.       
212b0 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65   int endCoalesce
212c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
212d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
212e0 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
212f0 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  g>=2 );.        
21300 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
21310 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
21320 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
21330 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  t);.        for(
21340 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=1; i<nFarg; i+
21350 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
21360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21370 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74  v, OP_NotNull, t
21380 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73  arget, endCoales
21390 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ce);.          V
213a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
213b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
213c0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
213d0 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c  (pParse, target,
213e0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
213f0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
21400 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
21410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
21420 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
21430 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
21440 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
21450 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21460 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
21470 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21480 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21490 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
214a0 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
214b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
214c0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68    }..      /* Th
214d0 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e  e UNLIKELY() fun
214e0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
214f0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
21500 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
21510 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
21520 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
21530 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
21540 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
21550 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49  SQLITE_FUNC_UNLI
21560 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  KELY ){.        
21570 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31  assert( nFarg>=1
21580 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
21590 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
215a0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
215b0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
215c0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
215d0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
215e0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
215f0 2f 2a 20 54 68 65 20 41 46 46 49 4e 49 54 59 28  /* The AFFINITY(
21600 29 20 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75  ) function evalu
21610 61 74 65 73 20 74 6f 20 61 20 73 74 72 69 6e 67  ates to a string
21620 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
21630 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 79 70        ** the typ
21640 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
21650 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69  e argument.  Thi
21660 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
21670 73 74 69 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a  sting of.      *
21680 2a 20 74 68 65 20 53 51 4c 69 74 65 20 74 79 70  * the SQLite typ
21690 65 20 6c 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a  e logic..      *
216a0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
216b0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
216c0 4c 49 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49  LITE_FUNC_AFFINI
216d0 54 59 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  TY ){.        co
216e0 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 66 66 5b  nst char *azAff[
216f0 5d 20 3d 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74  ] = { "blob", "t
21700 65 78 74 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c  ext", "numeric",
21710 20 22 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61   "integer", "rea
21720 6c 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 63 68  l" };.        ch
21730 61 72 20 61 66 66 3b 0a 20 20 20 20 20 20 20 20  ar aff;.        
21740 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31  assert( nFarg==1
21750 20 29 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20   );.        aff 
21760 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
21770 69 6e 69 74 79 28 70 46 61 72 67 2d 3e 61 5b 30  inity(pFarg->a[0
21780 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
21790 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
217a0 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65  dString(v, targe
217b0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 20 20 61 66 66 20 3f 20 61 7a 41 66 66 5b 61 66    aff ? azAff[af
217e0 66 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  f-SQLITE_AFF_BLO
217f0 42 5d 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20  B] : "none");.  
21800 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
21810 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  get;.      }.#en
21820 64 69 66 0a 0a 20 20 20 20 20 20 66 6f 72 28 69  dif..      for(i
21830 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =0; i<nFarg; i++
21840 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
21850 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78  <32 && sqlite3Ex
21860 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61  prIsConstant(pFa
21870 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  rg->a[i].pExpr) 
21880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
21890 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a  tcase( i==31 );.
218a0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
218b0 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32  ask |= MASKBIT32
218c0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
218d0 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
218e0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
218f0 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
21900 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c  LL)!=0 && !pColl
21910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
21920 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
21930 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
21940 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
21950 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
21960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21970 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20   pFarg ){.      
21980 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20    if( constMask 
21990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  ){.          r1 
219a0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
219b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
219c0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72  se->nMem += nFar
219d0 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  g;.        }else
219e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
219f0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
21a00 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61  ange(pParse, nFa
21a10 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  rg);.        }..
21a20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
21a30 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65  ength() and type
21a40 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77  of() functions w
21a50 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67  ith a column arg
21a60 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a  ument,.        *
21a70 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72  * set the P5 par
21a80 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50  ameter to the OP
21a90 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74  _Column opcode t
21aa0 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  o OPFLAG_LENGTHA
21ab0 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  RG.        ** or
21ac0 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
21ad0 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  G respectively, 
21ae0 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
21af0 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20  sary data.      
21b00 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20    ** loading..  
21b10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21b20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
21b30 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
21b40 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49  FUNC_LENGTH|SQLI
21b50 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29  TE_FUNC_TYPEOF))
21b60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
21b70 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20   u8 exprOp;.    
21b80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
21b90 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg==1 );.      
21ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72      assert( pFar
21bb0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  g->a[0].pExpr!=0
21bc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78   );.          ex
21bd0 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b  prOp = pFarg->a[
21be0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20  0].pExpr->op;.  
21bf0 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72          if( expr
21c00 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  Op==TK_COLUMN ||
21c10 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f   exprOp==TK_AGG_
21c20 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
21c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
21c40 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
21c50 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  ==OPFLAG_LENGTHA
21c60 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
21c70 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
21c80 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50  _FUNC_TYPEOF==OP
21c90 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29  FLAG_TYPEOFARG )
21ca0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
21cb0 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75  stcase( pDef->fu
21cc0 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  ncFlags & OPFLAG
21cd0 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
21ce0 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d            pFarg-
21cf0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32  >a[0].pExpr->op2
21d00 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
21d10 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63        pDef->func
21d20 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f  Flags & (OPFLAG_
21d30 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47  LENGTHARG|OPFLAG
21d40 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20  _TYPEOFARG);.   
21d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21d60 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69   }..        sqli
21d70 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
21d80 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
21d90 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
21da0 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  34be */.        
21db0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
21dc0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
21dd0 70 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20  pFarg, r1, 0,.  
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
21e00 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51  LITE_ECEL_DUP|SQ
21e10 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
21e20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21e30 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
21e40 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20  Parse);      /* 
21e50 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
21e60 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  4be */.      }el
21e70 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
21e80 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
21e90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21ea0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
21eb0 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f     /* Possibly o
21ec0 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63  verload the func
21ed0 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73  tion if the firs
21ee0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20  t argument is.  
21ef0 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c      ** a virtual
21f00 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20   table column.. 
21f10 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
21f20 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74   For infix funct
21f30 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42  ions (LIKE, GLOB
21f40 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41  , REGEXP, and MA
21f50 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20  TCH) use the.   
21f60 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67     ** second arg
21f70 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66  ument, not the f
21f80 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67  irst, as the arg
21f90 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f  ument to test to
21fa0 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
21fb0 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20   it is a column 
21fc0 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
21fd0 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e  le.  This is don
21fe0 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  e because.      
21ff0 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  ** the left oper
22000 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e  and of infix fun
22010 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72  ctions (the oper
22020 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20  and we want to. 
22030 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20       ** control 
22040 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64  overloading) end
22050 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f  s up as the seco
22060 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
22070 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  he.      ** func
22080 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65  tion.  The expre
22090 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22  ssion "A glob B"
220a0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
220b0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f  o .      ** "glo
220c0 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74  b(B,A).  We want
220d0 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e   to use the A in
220e0 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74   "A glob B" to t
220f0 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  est.      ** for
22100 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f   function overlo
22110 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75  ading.  But we u
22120 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e  se the B term in
22130 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20   "glob(B,A)"..  
22140 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
22150 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45   nFarg>=2 && (pE
22160 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
22170 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20  InfixFunc) ){.  
22180 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
22190 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
221a0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
221b0 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
221c0 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
221d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
221e0 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  arg>0 ){.       
221f0 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
22200 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
22210 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46  ion(db, pDef, nF
22220 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  arg, pFarg->a[0]
22230 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
22240 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
22250 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
22260 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
22270 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
22280 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
22290 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
222a0 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20  ltColl; .       
222b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
222c0 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
222d0 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
222e0 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
222f0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 23  LSEQ);.      }.#
22300 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
22310 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46  BLE_OFFSET_SQL_F
22320 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20 70 44  UNC.      if( pD
22330 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
22340 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4f 46 46 53  SQLITE_FUNC_OFFS
22350 45 54 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  ET ){.        Ex
22360 70 72 20 2a 70 41 72 67 20 3d 20 70 46 61 72 67  pr *pArg = pFarg
22370 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
22380 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e        if( pArg->
22390 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
223a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
223b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
223c0 4f 50 5f 4f 66 66 73 65 74 2c 20 70 41 72 67 2d  OP_Offset, pArg-
223d0 3e 69 54 61 62 6c 65 2c 20 70 41 72 67 2d 3e 69  >iTable, pArg->i
223e0 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
223f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
22400 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22410 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22420 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
22430 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
22440 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
22450 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
22460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22470 70 34 28 76 2c 20 70 50 61 72 73 65 2d 3e 69 53  p4(v, pParse->iS
22480 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50 75 72 65  elfTab ? OP_Pure
22490 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75 6e 63 74  Func0 : OP_Funct
224a0 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20 20 20 20  ion0,.          
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
224d0 61 72 67 65 74 2c 20 28 63 68 61 72 2a 29 70 44  arget, (char*)pD
224e0 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
224f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22500 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
22510 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20  (u8)nFarg);.    
22520 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 46    }.      if( nF
22530 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b  arg && constMask
22540 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
22550 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
22560 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
22570 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  1, nFarg);.     
22580 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
22590 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
225a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
225b0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
225c0 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
225d0 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
225e0 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  T: {.      int n
225f0 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Col;.      testc
22600 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53  ase( op==TK_EXIS
22610 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
22620 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c  case( op==TK_SEL
22630 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ECT );.      if(
22640 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26   op==TK_SELECT &
22650 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d  & (nCol = pExpr-
22660 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
22670 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b  st->nExpr)!=1 ){
22680 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22690 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
226a0 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b  Parse, nCol, 1);
226b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
226c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
226d0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
226e0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
226f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
22700 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22710 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
22720 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  ELECT_COLUMN: {.
22730 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
22740 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
22750 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  eft->iTable==0 )
22760 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
22770 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d  >pLeft->iTable =
22780 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
22790 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
227a0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30  xpr->pLeft, 0, 0
227b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
227c0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
227d0 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
227e0 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
227f0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
22800 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
22810 62 6c 65 0a 20 20 20 20 20 20 20 26 26 20 70 45  ble.       && pE
22820 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20  xpr->iTable!=(n 
22830 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
22840 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70  torSize(pExpr->p
22850 4c 65 66 74 29 29 20 0a 20 20 20 20 20 20 29 7b  Left)) .      ){
22860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22870 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
22880 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73   "%d columns ass
22890 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22  igned %d values"
228a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228c0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c    pExpr->iTable,
228d0 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
228e0 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
228f0 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b  >pLeft->iTable +
22900 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
22910 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
22920 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
22930 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
22940 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
22950 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
22960 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
22970 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
22980 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
22990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
229a0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
229b0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
229c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
229d0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
229e0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
229f0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
22a00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22a10 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
22a20 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
22a30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
22a40 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
22a50 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
22a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22a70 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
22a80 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20  m, target, 0);. 
22a90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22aa0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
22ab0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
22ac0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
22ad0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
22ae0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
22af0 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20  BQUERY */...    
22b00 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42  /*.    **    x B
22b10 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
22b20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
22b30 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
22b40 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  to.    **.    **
22b50 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
22b60 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
22b70 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  X is stored in p
22b80 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
22b90 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20   ** Y is stored 
22ba0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
22bb0 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[0].pExpr..   
22bc0 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20   ** Z is stored 
22bd0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
22be0 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[1].pExpr..   
22bf0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
22c00 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
22c10 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
22c20 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
22c30 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20  target, 0, 0);. 
22c40 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
22c50 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
22c60 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20  se TK_SPAN:.    
22c70 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a  case TK_COLLATE:
22c80 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50   .    case TK_UP
22c90 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 70 45 78  LUS: {.      pEx
22ca0 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pr = pExpr->pLef
22cb0 74 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  t;.      goto ex
22cc0 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3b 20  pr_code_doover; 
22cd0 2f 2a 20 32 30 31 38 2d 30 34 2d 32 38 3a 20 50  /* 2018-04-28: P
22ce0 72 65 76 65 6e 74 20 64 65 65 70 20 72 65 63 75  revent deep recu
22cf0 72 73 69 6f 6e 2e 20 4f 53 53 46 75 7a 7a 2e 20  rsion. OSSFuzz. 
22d00 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  */.    }..    ca
22d10 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
22d20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
22d30 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
22d40 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
22d50 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
22d60 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
22d70 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
22d80 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
22d90 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
22da0 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
22db0 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
22dc0 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
22dd0 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
22de0 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
22df0 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
22e00 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
22e10 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
22e20 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
22e30 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
22e40 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
22e50 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
22e60 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
22e70 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
22e80 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
22e90 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
22ea0 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
22eb0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  *.      ** The e
22ec0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70  xpression is imp
22ed0 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
22ee0 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64  n OP_Param opcod
22ef0 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20  e. The p1.      
22f00 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
22f10 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20  set to 0 for an 
22f20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65  old.rowid refere
22f30 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29  nce, or to (i+1)
22f40 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66  .      ** to ref
22f50 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63  erence another c
22f60 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64  olumn of the old
22f70 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
22f80 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a   where .      **
22f90 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   i is the index 
22fa0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46  of the column. F
22fb0 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72  or a new.rowid r
22fc0 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a  eference, p1 is.
22fd0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
22fe0 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69  (n+1), where n i
22ff0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
23000 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20  columns in each 
23010 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20  pseudo-table..  
23020 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66      ** For a ref
23030 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74  erence to any ot
23040 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  her column in th
23050 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  e new.* pseudo-t
23060 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a  able, p1.      *
23070 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32  * is set to (n+2
23080 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64  +i), where n and
23090 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65   i are as define
230a0 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f  d previously. Fo
230b0 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70  r.      ** examp
230c0 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65  le, if the table
230d0 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65   on which trigge
230e0 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72  rs are being fir
230f0 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ed is.      ** d
23100 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20  eclared as:.    
23110 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
23120 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
23130 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a  a, b);.      **.
23140 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31        ** Then p1
23150 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
23160 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
23170 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
23180 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==0   ->    ol
23190 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d  d.rowid     p1==
231a0 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f  3   ->    new.ro
231b0 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  wid.      **   p
231c0 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==1   ->    old
231d0 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34  .a         p1==4
231e0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20     ->    new.a. 
231f0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20       **   p1==2 
23200 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20    ->    old.b   
23210 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e        p1==5   ->
23220 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20      new.b       
23230 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23240 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
23250 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
23260 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d   int p1 = pExpr-
23270 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d  >iTable * (pTab-
23280 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70  >nCol+1) + 1 + p
23290 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a  Expr->iColumn;..
232a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
232b0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
232c0 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  | pExpr->iTable=
232d0 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =1 );.      asse
232e0 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
232f0 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d  mn>=-1 && pExpr-
23300 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >iColumn<pTab->n
23310 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Col );.      ass
23320 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79  ert( pTab->iPKey
23330 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f  <0 || pExpr->iCo
23340 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65  lumn!=pTab->iPKe
23350 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
23360 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28  t( p1>=0 && p1<(
23370 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20  pTab->nCol*2+2) 
23380 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
23390 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
233a0 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72  P_Param, p1, tar
233b0 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  get);.      Vdbe
233c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 5b 25  Comment((v, "r[%
233d0 64 5d 3d 25 73 2e 25 73 22 2c 20 74 61 72 67 65  d]=%s.%s", targe
233e0 74 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70  t,.        (pExp
233f0 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77  r->iTable ? "new
23400 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20  " : "old"),.    
23410 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c      (pExpr->iCol
23420 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20  umn<0 ? "rowid" 
23430 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61  : pExpr->pTab->a
23440 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
23450 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a 20 20 20 20 20  mn].zName).     
23460 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   ));..#ifndef SQ
23470 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
23480 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f  NG_POINT.      /
23490 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
234a0 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74  has REAL affinit
234b0 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e  y, it may curren
234c0 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  tly be stored as
234d0 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74   an.      ** int
234e0 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61  eger. Use OP_Rea
234f0 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b  lAffinity to mak
23500 65 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61  e sure it is rea
23510 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20  lly real..      
23520 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
23530 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35  ENCE-OF: R-60985
23540 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20 77 69  -57662 SQLite wi
23550 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76  ll convert the v
23560 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20  alue back to.   
23570 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70     ** floating p
23580 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63  oint when extrac
23590 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65  ting it from the
235a0 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20   record.  */.   
235b0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
235c0 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20  olumn>=0 .      
235d0 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   && pTab->aCol[p
235e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61  Expr->iColumn].a
235f0 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
23600 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29  AFF_REAL.      )
23610 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23620 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
23630 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
23640 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
23650 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
23660 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
23670 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20  case TK_VECTOR: 
23680 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
23690 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
236a0 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
236b0 65 64 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ed");.      brea
236c0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
236d0 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  se TK_IF_NULL_RO
236e0 57 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  W: {.      int a
236f0 64 64 72 49 4e 52 3b 0a 20 20 20 20 20 20 61 64  ddrINR;.      ad
23700 64 72 49 4e 52 20 3d 20 73 71 6c 69 74 65 33 56  drINR = sqlite3V
23710 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
23720 49 66 4e 75 6c 6c 52 6f 77 2c 20 70 45 78 70 72  IfNullRow, pExpr
23730 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
23740 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
23750 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
23760 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
23770 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
23780 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
23790 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
237a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
237b0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
237c0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
237d0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
237e0 2c 20 61 64 64 72 49 4e 52 29 3b 0a 20 20 20 20  , addrINR);.    
237f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
23800 6e 67 65 50 33 28 76 2c 20 61 64 64 72 49 4e 52  ngeP3(v, addrINR
23810 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
23820 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
23830 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    /*.    ** Form
23840 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   A:.    **   CAS
23850 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e  E x WHEN e1 THEN
23860 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
23870 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
23880 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
23890 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
238a0 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20   Form B:.    ** 
238b0 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54    CASE WHEN e1 T
238c0 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
238d0 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
238e0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
238f0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
23900 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61   ** Form A is ca
23910 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64  n be transformed
23920 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61   into the equiva
23930 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66  lent form B as f
23940 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20  ollows:.    **  
23950 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20   CASE WHEN x=e1 
23960 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65  THEN r1 WHEN x=e
23970 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20  2 THEN r2 ....  
23980 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e    **        WHEN
23990 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c   x=eN THEN rN EL
239a0 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
239b0 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20      ** X (if it 
239c0 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45  exists) is in pE
239d0 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
239e0 2a 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c  ** Y is in the l
239f0 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70  ast element of p
23a00 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66  Expr->x.pList if
23a10 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
23a20 3e 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a  >nExpr is.    **
23a30 20 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20   odd.  The Y is 
23a40 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  also optional.  
23a50 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
23a60 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70   elements in x.p
23a70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65  List.    ** is e
23a80 76 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f  ven, then Y is o
23a90 6d 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22  mitted and the "
23aa0 6f 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c  otherwise" resul
23ab0 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  t is NULL..    *
23ac0 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72  * Ei is in pExpr
23ad0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20  ->pList->a[i*2] 
23ae0 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d  and Ri is pExpr-
23af0 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d  >pList->a[i*2+1]
23b00 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
23b10 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  The result of th
23b20 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
23b30 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66  the Ri for the f
23b40 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69  irst matching Ei
23b50 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74  ,.    ** or if t
23b60 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68  here is no match
23b70 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45  ing Ei, the ELSE
23b80 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74   term Y, or if t
23b90 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  here is.    ** n
23ba0 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c  o ELSE term, NUL
23bb0 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  L..    */.    de
23bc0 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f  fault: assert( o
23bd0 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a  p==TK_CASE ); {.
23be0 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62        int endLab
23bf0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
23c00 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20          /* GOTO 
23c10 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66  label for end of
23c20 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20   CASE stmt */.  
23c30 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65      int nextCase
23c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23c50 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
23c60 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45  bel for next WHE
23c70 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  N clause */.    
23c80 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20    int nExpr;    
23c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ca0 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72      /* 2x number
23cb0 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
23cc0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
23cf0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
23d00 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
23d10 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
23d20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
23d30 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
23d40 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
23d50 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65  ist_item *aListe
23d60 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f  lem;  /* Array o
23d70 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
23d80 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d        Expr opCom
23d90 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  pare;           
23da0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
23db0 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20  ==Ei expression 
23dc0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
23dd0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
23de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23df0 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  e X expression *
23e00 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54  /.      Expr *pT
23e10 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
23e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d            /* X==
23e30 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a  Ei (form A) or j
23e40 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20  ust Ei (form B) 
23e50 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  */.      VVA_ONL
23e60 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76  Y( int iCacheLev
23e70 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
23e80 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20  cheLevel; )..   
23e90 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
23ea0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
23eb0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
23ec0 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
23ed0 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  st );.      asse
23ee0 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  rt(pExpr->x.pLis
23ef0 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20  t->nExpr > 0);. 
23f00 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
23f10 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
23f20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20      aListelem = 
23f30 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  pEList->a;.     
23f40 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
23f50 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e  >nExpr;.      en
23f60 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  dLabel = sqlite3
23f70 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
23f80 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20  ;.      if( (pX 
23f90 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  = pExpr->pLeft)!
23fa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
23fb0 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20  mpX = *pX;.     
23fc0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
23fd0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
23fe0 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f  ;.        exprTo
23ff0 52 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c  Register(&tempX,
24000 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
24010 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20  pParse, &tempX, 
24020 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20  &regFree1));.   
24030 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
24040 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
24050 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70        memset(&op
24060 43 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65  Compare, 0, size
24070 6f 66 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a  of(opCompare));.
24080 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
24090 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20  e.op = TK_EQ;.  
240a0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
240b0 70 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a  pLeft = &tempX;.
240c0 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
240d0 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20  &opCompare;.    
240e0 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33      /* Ticket b3
240f0 35 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39  51d95f9cd5ef17e9
24100 64 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31  d9dbae18f5ca8611
24110 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20  190001:.        
24120 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
24130 72 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67  regFree1 might g
24140 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f  et SCopy-ed into
24150 20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74   the file result
24160 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20  ..        ** So 
24170 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
24180 68 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69  he regFree1 regi
24190 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73  ster is not reus
241a0 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20  ed for other.   
241b0 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73       ** purposes
241c0 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76   and possibly ov
241d0 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20  erwritten.  */. 
241e0 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20         regFree1 
241f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
24200 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
24210 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20  xpr-1; i=i+2){. 
24220 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
24230 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
24240 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
24250 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
24260 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d   assert( pTest!=
24270 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 );.          o
24280 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
24290 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
242a0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
242b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
242c0 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
242d0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
242e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
242f0 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
24300 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
24310 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
24320 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b  e( pTest->op==TK
24330 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
24340 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
24350 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
24360 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53  est, nextCase, S
24370 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
24380 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
24390 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
243a0 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
243b0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
243c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
243d0 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73  ode(pParse, aLis
243e0 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
243f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
24400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
24410 74 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  to(v, endLabel);
24420 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24430 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
24440 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
24450 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
24460 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73  Label(v, nextCas
24470 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
24480 20 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21    if( (nExpr&1)!
24490 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
244a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
244b0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
244c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
244d0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ode(pParse, pELi
244e0 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70  st->a[nExpr-1].p
244f0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
24500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
24510 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
24520 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
24530 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24550 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
24560 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24570 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
24580 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
24590 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
245a0 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  r>0 .           
245b0 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  || pParse->iCach
245c0 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65  eLevel==iCacheLe
245d0 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  vel );.      sql
245e0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
245f0 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c  abel(v, endLabel
24600 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
24610 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
24620 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
24630 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
24640 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ISE: {.      ass
24650 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69  ert( pExpr->affi
24660 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  nity==OE_Rollbac
24670 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  k .           ||
24680 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
24690 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20  ==OE_Abort.     
246a0 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
246b0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69  affinity==OE_Fai
246c0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
246d0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
246e0 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20  =OE_Ignore.     
246f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
24700 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
24710 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
24720 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
24730 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
24750 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
24760 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
24770 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
24780 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
24790 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
247a0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
247b0 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
247c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
247d0 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
247e0 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
247f0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
24800 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
24810 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
24820 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
24830 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
24840 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
24850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24860 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20  dOp4(.          
24870 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51    v, OP_Halt, SQ
24880 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f  LITE_OK, OE_Igno
24890 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  re, 0, pExpr->u.
248a0 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20  zToken,0);.     
248b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
248c0 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
248d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
248e0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
248f0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
24900 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
24910 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
24940 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
24950 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
24960 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
24970 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
24980 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
24990 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
249a0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
249b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
249c0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
249d0 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
249e0 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  nReg;.}../*.** F
249f0 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f  actor out the co
24a00 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  de of the given 
24a10 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e  expression to in
24a20 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
24a30 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44  e..**.** If regD
24a40 65 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  est>=0 then the 
24a50 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73  result is always
24a60 20 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20   stored in that 
24a70 72 65 67 69 73 74 65 72 20 61 6e 64 20 74 68 65  register and the
24a80 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  .** result is no
24a90 74 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20  t reusable.  If 
24aa0 72 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74  regDest<0 then t
24ab0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66  his routine is f
24ac0 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65  ree to .** store
24ad0 20 74 68 65 20 76 61 6c 75 65 20 77 68 65 72 65   the value where
24ae0 65 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20  ever it wants.  
24af0 54 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  The register whe
24b00 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
24b10 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  n .** is stored 
24b20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68  is returned.  Wh
24b30 65 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77  en regDest<0, tw
24b40 6f 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72  o identical expr
24b50 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20  essions will.** 
24b60 63 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65  code to the same
24b70 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e   register..*/.in
24b80 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
24b90 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
24ba0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
24bb0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
24bc0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
24bd0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
24be0 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
24bf0 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
24c00 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
24c10 69 6e 74 20 72 65 67 44 65 73 74 20 20 20 20 20  int regDest     
24c20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
24c30 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
24c40 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
24c50 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73  prList *p;.  ass
24c60 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72  ert( ConstFactor
24c70 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20  Ok(pParse) );.  
24c80 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  p = pParse->pCon
24c90 73 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65  stExpr;.  if( re
24ca0 67 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a  gDest<0 && p ){.
24cb0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
24cc0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
24cd0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
24ce0 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20  for(pItem=p->a, 
24cf0 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b  i=p->nExpr; i>0;
24d00 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a   pItem++, i--){.
24d10 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
24d20 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c  >reusable && sql
24d30 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
24d40 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70  0,pItem->pExpr,p
24d50 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20  Expr,-1)==0 ){. 
24d60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49         return pI
24d70 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
24d80 72 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rReg;.      }.  
24d90 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 20    }.  }.  pExpr 
24da0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
24db0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
24dc0 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71  pr, 0);.  p = sq
24dd0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
24de0 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70  end(pParse, p, p
24df0 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29  Expr);.  if( p )
24e00 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45 78  {.     struct Ex
24e10 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
24e20 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45  em = &p->a[p->nE
24e30 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74  xpr-1];.     pIt
24e40 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72  em->reusable = r
24e50 65 67 44 65 73 74 3c 30 3b 0a 20 20 20 20 20 69  egDest<0;.     i
24e60 66 28 20 72 65 67 44 65 73 74 3c 30 20 29 20 72  f( regDest<0 ) r
24e70 65 67 44 65 73 74 20 3d 20 2b 2b 70 50 61 72 73  egDest = ++pPars
24e80 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49  e->nMem;.     pI
24e90 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
24ea0 72 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a  rReg = regDest;.
24eb0 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43    }.  pParse->pC
24ec0 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 20 20  onstExpr = p;.  
24ed0 72 65 74 75 72 6e 20 72 65 67 44 65 73 74 3b 0a  return regDest;.
24ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
24ef0 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
24f00 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
24f10 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
24f20 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61  esults.** into a
24f30 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75   register.  Retu
24f40 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
24f50 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65  number where the
24f60 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20   results.** are 
24f70 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  stored..**.** If
24f80 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
24f90 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
24fa0 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  ister that can b
24fb0 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a  e deallocated,.*
24fc0 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73  * then write its
24fd0 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52   number into *pR
24fe0 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  eg.  If the resu
24ff0 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  lt register is n
25000 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  ot.** a temporar
25010 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  y, then set *pRe
25020 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  g to zero..**.**
25030 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
25040 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
25050 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
25060 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a   generate this.*
25070 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74  * code to fill t
25080 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  he register in t
25090 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
250a0 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  n section of the
250b0 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
250c0 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61  , in order to fa
250d0 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74  ctor it out of t
250e0 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f  he evaluation lo
250f0 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
25100 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50  e3ExprCodeTemp(P
25110 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
25120 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a  pr *pExpr, int *
25130 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b  pReg){.  int r2;
25140 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
25150 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
25160 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  e(pExpr);.  if( 
25170 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
25180 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78 70  arse).   && pExp
25190 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
251a0 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ER.   && sqlite3
251b0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
251c0 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29  tJoin(pExpr).  )
251d0 7b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30  {.    *pReg  = 0
251e0 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
251f0 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
25200 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
25210 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
25220 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
25230 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
25240 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73  rse);.    r2 = s
25250 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
25260 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
25270 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28  pr, r1);.    if(
25280 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20   r2==r1 ){.     
25290 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20   *pReg = r1;.   
252a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
252b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
252c0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
252d0 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30  .      *pReg = 0
252e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
252f0 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
25300 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
25310 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
25320 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
25330 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
25340 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
25350 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
25360 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
25370 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
25380 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
25390 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
253a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
253b0 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
253c0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
253d0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
253e0 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
253f0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
25400 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
25410 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
25420 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d   pExpr && pExpr-
25430 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
25440 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
25450 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
25460 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
25470 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
25480 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
25490 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73  e{.    inReg = s
254a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
254b0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
254c0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
254d0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
254e0 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61  >pVdbe!=0 || pPa
254f0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
25500 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
25510 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
25520 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
25530 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25540 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
25550 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
25560 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
25570 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
25580 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72  ./*.** Make a tr
25590 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20  ansient copy of 
255a0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
255b0 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69   and then code i
255c0 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  t using.** sqlit
255d0 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54  e3ExprCode().  T
255e0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
255f0 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69  s just like sqli
25600 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a  te3ExprCode().**
25610 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
25620 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
25630 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  n is guaranteed 
25640 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  to be unchanged.
25650 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25660 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72  ExprCodeCopy(Par
25670 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
25680 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
25690 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  get){.  sqlite3 
256a0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
256b0 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
256c0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
256d0 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
256e0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
256f0 64 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43  d ) sqlite3ExprC
25700 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
25710 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71  r, target);.  sq
25720 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
25730 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  db, pExpr);.}../
25740 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
25750 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
25760 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
25770 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
25780 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
25790 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
257a0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
257b0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
257c0 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
257d0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
257e0 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
257f0 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
25800 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
25810 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f  ne.** might choo
25820 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65  se to code the e
25830 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69  xpression at ini
25840 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
25850 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25860 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
25870 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
25880 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
25890 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
258a0 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e  f( pParse->okCon
258b0 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69  stFactor && sqli
258c0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
258d0 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20  tNotJoin(pExpr) 
258e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
258f0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
25900 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
25910 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et);.  }else{.  
25920 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
25930 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
25940 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a   target);.  }.}.
25950 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
25960 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
25970 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
25980 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
25990 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
259a0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
259b0 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
259c0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
259d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
259e0 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
259f0 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
25a00 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
25a10 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
25a20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
25a30 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
25a40 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
25a50 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
25a60 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
25a70 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
25a80 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
25a90 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
25aa0 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
25ab0 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
25ac0 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
25ad0 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
25ae0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
25af0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
25b00 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
25b10 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
25b20 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
25b30 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
25b40 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
25b50 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
25b60 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
25b70 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20  .  int iMem;..  
25b80 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
25b90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
25ba0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
25bb0 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  STER );.  sqlite
25bc0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
25bd0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
25be0 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ;.  iMem = ++pPa
25bf0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
25c00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25c10 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65  , OP_Copy, targe
25c20 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72  t, iMem);.  expr
25c30 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72  ToRegister(pExpr
25c40 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iMem);.}../*.*
25c50 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
25c60 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
25c70 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
25c80 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
25c90 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
25ca0 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
25cb0 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
25cc0 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
25cd0 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
25ce0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
25cf0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
25d00 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6d  luated.  The num
25d10 62 65 72 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ber returned wil
25d20 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65 20  l.** usually be 
25d30 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62 75 74  pList->nExpr but
25d40 20 6d 69 67 68 74 20 62 65 20 72 65 64 75 63 65   might be reduce
25d50 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c  d if SQLITE_ECEL
25d60 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20 64  _OMITREF.** is d
25d70 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  efined..**.** Th
25d80 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  e SQLITE_ECEL_DU
25d90 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  P flag prevents 
25da0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72  the arguments fr
25db0 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c  om being.** fill
25dc0 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70  ed using OP_SCop
25dd0 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74  y.  OP_Copy must
25de0 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
25df0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
25e00 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61  TE_ECEL_FACTOR a
25e10 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63  rgument allows c
25e20 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
25e30 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f  s to be.** facto
25e40 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69  red out into ini
25e50 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65  tialization code
25e60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
25e70 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67  TE_ECEL_REF flag
25e80 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72   means that expr
25e90 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c  essions in the l
25ea0 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72  ist with.** Expr
25eb0 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72  List.a[].u.x.iOr
25ec0 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20  derByCol>0 have 
25ed0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61  already been eva
25ee0 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65  luated and store
25ef0 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  d.** in register
25f00 73 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64  s at srcReg, and
25f10 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61   so the value ca
25f20 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d  n be copied from
25f30 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51   there..** If SQ
25f40 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
25f50 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c 20 74  F is also set, t
25f60 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 77  hen the values w
25f70 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72 42 79  ith u.x.iOrderBy
25f80 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d  Col>0.** are sim
25f90 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61 74 68  ply omitted rath
25fa0 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20 63 6f  er than being co
25fb0 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52 65 67  pied from srcReg
25fc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25fd0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
25fe0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
25ff0 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
26000 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
26010 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
26020 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
26030 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
26040 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
26050 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
26060 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
26070 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
26080 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f  srcReg,        /
26090 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74 65  * Source registe
260a0 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45  rs if SQLITE_ECE
260b0 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c  L_REF */.  u8 fl
260c0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
260d0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66   SQLITE_ECEL_* f
260e0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lags */.){.  str
260f0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
26100 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
26110 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f  i, j, n;.  u8 co
26120 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20  pyOp = (flags & 
26130 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
26140 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
26150 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76  SCopy;.  Vdbe *v
26160 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
26170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
26180 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
26190 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
261a0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
261b0 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
261c0 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
261d0 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
261e0 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
261f0 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73  xpr;.  if( !Cons
26200 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
26210 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51  ) ) flags &= ~SQ
26220 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
26230 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
26240 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
26250 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
26260 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
26270 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
26280 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
26290 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
262a0 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
262b0 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
262c0 66 20 29 7b 0a 20 20 20 20 20 20 69 2d 2d 3b 0a  f ){.      i--;.
262d0 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d        n--;.    }
262e0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
262f0 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
26300 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30  ITE_ECEL_REF)!=0
26310 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e   && (j = pItem->
26320 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
26330 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
26340 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
26350 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20  CEL_OMITREF ){. 
26360 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20         i--;.    
26370 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
26380 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
26390 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
263a0 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63  v, copyOp, j+src
263b0 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29  Reg-1, target+i)
263c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
263d0 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
263e0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
263f0 54 4f 52 29 21 3d 30 0a 20 20 20 20 20 20 20 20  TOR)!=0.        
26400 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
26410 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
26420 69 6e 28 70 45 78 70 72 29 0a 20 20 20 20 29 7b  in(pExpr).    ){
26430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26440 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
26450 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
26460 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  et+i);.    }else
26470 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65  {.      int inRe
26480 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
26490 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
264a0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
264b0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  i);.      if( in
264c0 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b  Reg!=target+i ){
264d0 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
264e0 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  *pOp;.        if
264f0 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70  ( copyOp==OP_Cop
26500 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  y.         && (p
26510 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65  Op=sqlite3VdbeGe
26520 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63  tOp(v, -1))->opc
26530 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  ode==OP_Copy.   
26540 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
26550 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65  +pOp->p3+1==inRe
26560 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  g.         && pO
26570 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p2+pOp->p3+1=
26580 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20  =target+i.      
26590 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
265a0 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20  Op->p3++;.      
265b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
265c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
265d0 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
265e0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
265f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26600 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
26610 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
26620 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
26630 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f   for a BETWEEN o
26640 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  perator..**.**  
26650 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
26660 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  D z.**.** The ab
26670 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ove is equivalen
26680 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78  t to .**.**    x
26690 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a  >=y AND x<=z.**.
266a0 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
266b0 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
266c0 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
266d0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
266e0 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66  * elimination of
266f0 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a   x..**.** The xJ
26700 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20  umpIf parameter 
26710 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69  determines detai
26720 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c  ls:.**.**    NUL
26730 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
26740 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62       Store the b
26750 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e  oolean result in
26760 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20   reg[dest].**   
26770 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
26780 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f  ue:      Jump to
26790 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a   dest if true.**
267a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
267b0 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70  fFalse:     Jump
267c0 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73   to dest if fals
267d0 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70  e.**.** The jump
267e0 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72  IfNull parameter
267f0 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78   is ignored if x
26800 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a  JumpIf is NULL..
26810 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
26820 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
26830 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
26840 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
26850 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
26860 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
26870 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
26880 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
26890 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
268a0 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
268b0 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
268c0 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67  nation or storag
268d0 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  e location */.  
268e0 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61  void (*xJump)(Pa
268f0 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69  rse*,Expr*,int,i
26900 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74  nt), /* Action t
26910 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20  o take */.  int 
26920 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
26930 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
26940 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
26950 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70   NULL */.){. Exp
26960 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
26970 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
26980 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
26990 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
269a0 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
269b0 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
269c0 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
269d0 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
269e0 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
269f0 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
26a00 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
26a10 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
26a20 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
26a30 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
26a40 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a  e register */...
26a50 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65    memset(&compLe
26a60 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ft, 0, sizeof(Ex
26a70 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
26a80 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69  compRight, 0, si
26a90 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d  zeof(Expr));.  m
26aa0 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20  emset(&exprAnd, 
26ab0 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
26ac0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  ;..  assert( !Ex
26ad0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
26ae0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
26af0 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
26b00 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
26b10 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
26b20 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
26b30 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
26b40 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
26b50 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
26b60 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
26b70 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
26b80 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
26b90 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
26ba0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
26bb0 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
26bc0 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
26bd0 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
26be0 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
26bf0 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
26c00 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
26c10 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
26c20 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54  ].pExpr;.  exprT
26c30 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58  oRegister(&exprX
26c40 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  , exprCodeVector
26c50 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c  (pParse, &exprX,
26c60 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20   &regFree1));.  
26c70 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20  if( xJump ){.   
26c80 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20 26   xJump(pParse, &
26c90 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
26ca0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
26cb0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  lse{.    /* Mark
26cc0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
26cd0 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20 74 68  is being from th
26ce0 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
26cf0 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20  ause of a join. 
26d00 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68     ** so that th
26d10 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
26d20 65 54 61 72 67 65 74 28 29 20 72 6f 75 74 69 6e  eTarget() routin
26d30 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
26d40 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20 2a  pt to move.    *
26d50 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20 50 61  * it into the Pa
26d60 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c  rse.pConstExpr l
26d70 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  ist.  We should 
26d80 75 73 65 20 61 20 6e 65 77 20 62 69 74 20 66 6f  use a new bit fo
26d90 72 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a 20 66  r this,.    ** f
26da0 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74 20  or clarity, but 
26db0 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62 69  we are out of bi
26dc0 74 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e 66  ts in the Expr.f
26dd0 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77 65  lags field so we
26de0 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f 20  .    ** have to 
26df0 72 65 75 73 65 20 74 68 65 20 45 50 5f 46 72 6f  reuse the EP_Fro
26e00 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d 6d  mJoin bit.  Bumm
26e10 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70 72 58  er. */.    exprX
26e20 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f  .flags |= EP_Fro
26e30 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74  mJoin;.    sqlit
26e40 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
26e50 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
26e60 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20  d, dest);.  }.  
26e70 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
26e80 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
26e90 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45  gFree1);..  /* E
26ea0 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74  nsure adequate t
26eb0 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  est coverage */.
26ec0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26ed0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26ee0 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
26ef0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
26f00 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
26f10 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
26f20 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
26f30 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
26f40 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
26f50 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
26f60 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
26f70 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
26f80 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
26f90 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
26fa0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
26fb0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
26fc0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
26fd0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
26fe0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
26ff0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
27000 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
27010 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
27020 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
27030 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
27040 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27050 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
27060 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
27070 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
27080 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
27090 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
270a0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
270b0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
270c0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
270d0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
270e0 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
270f0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
27100 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
27110 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a  se( xJump==0 );.
27120 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
27130 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
27140 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
27150 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
27160 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
27170 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
27180 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
27190 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
271a0 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
271b0 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
271c0 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
271d0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
271e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
271f0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
27200 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
27210 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
27220 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
27230 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
27240 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
27250 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
27260 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
27270 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
27280 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
27290 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
272a0 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
272b0 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
272c0 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
272d0 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
272e0 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
272f0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
27300 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
27310 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
27320 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
27330 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
27340 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
27350 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
27360 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
27370 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
27380 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
27390 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
273a0 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
273b0 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
273c0 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
273d0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
273e0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
273f0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
27400 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
27410 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
27420 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
27430 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
27440 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
27450 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
27460 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
27470 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
27480 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
27490 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
274a0 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
274b0 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
274c0 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74  (v==0) )     ret
274d0 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e  urn;  /* Existen
274e0 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
274f0 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
27500 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
27510 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  r==0) ) return; 
27520 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20   /* No way this 
27530 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  can happen */.  
27540 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
27550 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
27560 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
27570 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
27580 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
27590 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
275a0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
275b0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
275c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
275d0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
275e0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75  pr->pLeft, d2,ju
275f0 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
27600 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
27610 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
27620 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
27630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27640 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
27650 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
27660 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
27670 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27680 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
27690 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
276a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
276b0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
276c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
276d0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
276e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
276f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
27700 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27710 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
27720 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
27730 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
27740 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27750 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
27760 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
27770 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
27780 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
27790 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
277a0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
277b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
277c0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
277d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
277e0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
277f0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
27800 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
27810 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27820 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
27830 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
27840 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
27850 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
27860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
27870 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20   TK_TRUTH: {.   
27880 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20     int isNot;   
27890 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55     /* IS NOT TRU
278a0 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c 53  E or IS NOT FALS
278b0 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  E */.      int i
278c0 73 54 72 75 65 3b 20 20 20 20 20 2f 2a 20 49 53  sTrue;     /* IS
278d0 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20   TRUE or IS NOT 
278e0 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65  TRUE */.      te
278f0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27900 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ll==0 );.      i
27910 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70  sNot = pExpr->op
27920 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20  2==TK_ISNOT;.   
27930 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69     isTrue = sqli
27940 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75  te3ExprTruthValu
27950 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  e(pExpr->pRight)
27960 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27970 28 20 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f  ( isTrue && isNo
27980 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
27990 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26 20  ase( !isTrue && 
279a0 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69  isNot );.      i
279b0 66 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f  f( isTrue ^ isNo
279c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
279d0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
279e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
279f0 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20  eft, dest,.     
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a10 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c       isNot ? SQL
27a20 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a  ITE_JUMPIFNULL :
27a30 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
27a40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
27a50 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
27a60 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
27a70 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20  t, dest,.       
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a90 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c 49      isNot ? SQLI
27aa0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a 20  TE_JUMPIFNULL : 
27ab0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
27ac0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
27ad0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
27ae0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
27af0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
27b00 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
27b10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
27b20 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
27b30 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
27b40 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
27b50 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_NE;.      jum
27b60 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
27b70 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
27b80 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
27b90 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
27ba0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
27bb0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
27bc0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
27bd0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
27be0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
27bf0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
27c00 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
27c10 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
27c20 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
27c30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27c40 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
27c50 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
27c60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
27c70 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
27c80 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
27c90 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
27ca0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
27cb0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
27cc0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
27cd0 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
27ce0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
27cf0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
27d00 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
27d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27d20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
27d30 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
27d40 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
27d50 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
27d60 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
27d70 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27d80 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
27d90 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
27da0 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
27db0 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
27dc0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
27dd0 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
27de0 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
27df0 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
27e00 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
27e10 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
27e20 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
27e30 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
27e40 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
27e50 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
27e60 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
27e70 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
27e80 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
27e90 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
27ea0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
27eb0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27ec0 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
27ed0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
27ee0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
27ef0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27f00 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
27f10 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
27f20 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
27f30 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
27f40 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
27f50 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
27f60 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27f70 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
27f80 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
27f90 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
27fa0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27fb0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
27fc0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
27fd0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
27fe0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27ff0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
28000 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
28010 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
28020 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
28030 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
28040 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
28050 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
28060 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
28070 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
28080 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
28090 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
280a0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
280b0 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
280c0 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
280d0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
280e0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
280f0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
28100 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
28110 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
28120 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28130 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
28140 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
28150 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28160 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
28170 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
28180 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
28190 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
281a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
281b0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
281c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
281d0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
281e0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
281f0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
28200 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
28210 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
28220 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
28230 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
28240 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
28250 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28260 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
28270 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
28280 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
28290 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
282a0 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
282b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
282c0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
282d0 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
282e0 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
282f0 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
28300 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28310 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
28320 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
28330 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
28340 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
28350 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
28360 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
28370 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
28380 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
28390 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
283a0 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
283b0 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
283c0 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20  expr:.      if( 
283d0 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
283e0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
283f0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
28400 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
28410 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
28420 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
28430 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
28440 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  No-op */.      }
28450 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
28460 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
28470 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
28480 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
28490 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
284a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
284b0 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
284c0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
284d0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
284e0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
284f0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
28500 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
28510 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
28520 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
28530 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
28540 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
28550 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
28560 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
28570 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
28580 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
28590 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
285a0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
285b0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
285c0 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
285d0 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
285e0 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
285f0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
28600 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
28610 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
28620 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
28630 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
28640 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
28650 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
28660 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
28670 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
28680 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
28690 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
286a0 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
286b0 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
286c0 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
286d0 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
286e0 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
286f0 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
28700 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
28710 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
28720 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
28730 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
28740 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
28750 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
28760 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
28770 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
28780 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
28790 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
287a0 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
287b0 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
287c0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
287d0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
287e0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
287f0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
28800 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65  eturn; /* Existe
28810 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
28820 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
28830 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
28840 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
28850 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
28860 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
28870 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
28880 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
28890 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
288a0 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
288b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
288c0 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
288d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
288e0 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
288f0 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
28900 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
28910 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
28920 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
28930 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
28940 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
28950 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
28970 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
28980 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
28990 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
289a0 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
289b0 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
289c0 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
289d0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
289e0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
289f0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
28a00 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
28a10 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
28a20 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
28a30 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
28a40 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
28a50 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
28a60 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
28a70 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
28a80 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
28a90 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
28aa0 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
28ab0 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
28ac0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
28ad0 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
28ae0 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
28af0 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
28b00 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
28b10 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
28b20 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
28b30 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
28b40 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
28b50 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
28b60 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
28b70 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
28b80 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28b90 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
28ba0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
28bb0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28bc0 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
28bd0 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
28be0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
28bf0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
28c00 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
28c10 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
28c20 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
28c30 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
28c40 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
28c50 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
28c60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
28c70 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
28c80 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
28c90 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28ca0 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
28cb0 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
28cc0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
28cd0 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
28ce0 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
28cf0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
28d00 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
28d10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28d20 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28d40 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
28d50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
28d60 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
28d70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
28d80 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
28d90 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
28da0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
28db0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
28dc0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
28dd0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
28de0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
28df0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
28e00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
28e10 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
28e20 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
28e30 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
28e40 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
28e50 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
28e60 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
28e70 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
28e80 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
28e90 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70  >pLeft, d2, jump
28ea0 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
28eb0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
28ec0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
28ed0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
28ee0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28ef0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
28f00 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
28f10 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
28f20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28f30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
28f40 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
28f50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
28f60 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
28f70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
28f80 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
28f90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28fa0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
28fb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
28fc0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
28fd0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28fe0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
28ff0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
29000 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
29010 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20  K_TRUTH: {.     
29020 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a   int isNot;   /*
29030 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20   IS NOT TRUE or 
29040 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a  IS NOT FALSE */.
29050 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65        int isTrue
29060 3b 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72  ;  /* IS TRUE or
29070 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a   IS NOT TRUE */.
29080 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29090 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
290a0 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70  .      isNot = p
290b0 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53  Expr->op2==TK_IS
290c0 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75  NOT;.      isTru
290d0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54  e = sqlite3ExprT
290e0 72 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d  ruthValue(pExpr-
290f0 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
29100 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65  testcase( isTrue
29110 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20   && isNot );.   
29120 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
29130 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b  True && isNot );
29140 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72 75  .      if( isTru
29150 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20  e ^ isNot ){.   
29160 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20       /* IS TRUE 
29170 61 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c 53 45  and IS NOT FALSE
29180 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
29190 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
291a0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
291b0 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20  eft, dest,.     
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291d0 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30 20        isNot ? 0 
291e0 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  : SQLITE_JUMPIFN
291f0 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d 65 6c  ULL);..      }el
29200 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
29210 53 20 46 41 4c 53 45 20 61 6e 64 20 49 53 20 4e  S FALSE and IS N
29220 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20  OT TRUE */.     
29230 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
29240 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
29250 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
29260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29270 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
29280 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55   ? 0 : SQLITE_JU
29290 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
292a0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
292b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
292c0 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
292d0 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
292e0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
292f0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
29300 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
29310 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
29320 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
29330 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
29340 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
29350 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  Q;.      jumpIfN
29360 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
29370 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
29380 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
29390 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
293a0 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
293b0 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
293c0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
293d0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
293e0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
293f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
29400 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
29410 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
29420 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
29430 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
29440 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
29450 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
29460 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
29470 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
29480 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
29490 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
294a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
294b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
294c0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
294d0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
294e0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
294f0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
29500 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
29520 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
29530 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
29540 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
29550 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
29560 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
29570 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
29580 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
29590 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
295a0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
295b0 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
295c0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
295d0 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
295e0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
295f0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
29600 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
29610 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
29620 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
29630 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
29640 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
29650 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
29660 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
29670 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
29680 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
29690 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
296a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
296b0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
296c0 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
296d0 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
296e0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
296f0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
29700 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
29710 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
29720 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
29730 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
29740 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
29750 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
29760 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
29770 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
29780 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
29790 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
297a0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
297b0 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
297c0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
297d0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
297e0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
297f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
29800 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
29810 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
29820 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
29830 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
29840 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
29850 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
29860 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
29870 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
29880 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
29890 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
298a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
298b0 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
298c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
298d0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20  p==TK_ISNULL ); 
298e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
298f0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
29900 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
29910 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
29920 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LL );  VdbeCover
29930 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
29940 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
29950 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
29960 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
29970 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
29980 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
29990 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
299a0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
299b0 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
299c0 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
299d0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
299e0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
299f0 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
29a00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29a10 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
29a20 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
29a30 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
29a40 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
29a50 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
29a60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
29a70 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
29a80 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
29a90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29aa0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
29ab0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
29ac0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
29ad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
29ae0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
29af0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
29b00 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
29b10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
29b20 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
29b30 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
29b40 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
29b50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
29b60 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
29b70 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20  default_expr: . 
29b80 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
29b90 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
29ba0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
29bb0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
29bc0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
29bd0 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
29be0 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
29bf0 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
29c00 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
29c10 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
29c20 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
29c30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
29c40 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
29c50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29c60 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
29c70 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
29c80 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
29c90 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
29ca0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
29cb0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
29cc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
29cd0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
29ce0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
29cf0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29d00 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
29d10 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
29d20 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
29d30 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
29d40 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
29d50 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
29d60 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
29d70 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29  te3ExprIfFalse()
29d80 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63   except that a c
29d90 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70  opy is made of p
29da0 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63  Expr before.** c
29db0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20  ode generation, 
29dc0 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73  and that copy is
29dd0 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63   deleted after c
29de0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
29df0 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20  This.** ensures 
29e00 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
29e10 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61  l pExpr is uncha
29e20 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
29e30 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
29e40 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Dup(Parse *pPars
29e50 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
29e60 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d  int dest,int jum
29e70 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69  pIfNull){.  sqli
29e80 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
29e90 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43  ->db;.  Expr *pC
29ea0 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
29eb0 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
29ec0 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
29ed0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
29ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
29ef0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
29f00 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d  pCopy, dest, jum
29f10 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
29f20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
29f30 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a  e(db, pCopy);.}.
29f40 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f  ./*.** Expressio
29f50 6e 20 70 56 61 72 20 69 73 20 67 75 61 72 61 6e  n pVar is guaran
29f60 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 53 51  teed to be an SQ
29f70 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45 78 70  L variable. pExp
29f80 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a 2a 20  r may be any.** 
29f90 74 79 70 65 20 6f 66 20 65 78 70 72 65 73 73 69  type of expressi
29fa0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  on..**.** If pEx
29fb0 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53  pr is a simple S
29fc0 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20 69 6e  QL value - an in
29fd0 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74 72  teger, real, str
29fe0 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20  ing, blob.** or 
29ff0 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74 68 65  NULL value - the
2a000 6e 20 74 68 65 20 56 44 42 45 20 63 75 72 72 65  n the VDBE curre
2a010 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65 70 61  ntly being prepa
2a020 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65  red is configure
2a030 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65 70 61  d.** to re-prepa
2a040 72 65 20 65 61 63 68 20 74 69 6d 65 20 61 20 6e  re each time a n
2a050 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f 75 6e  ew value is boun
2a060 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56  d to variable pV
2a070 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69  ar..**.** Additi
2a080 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78 70 72  onally, if pExpr
2a090 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c   is a simple SQL
2a0a0 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 76   value and the v
2a0b0 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20 73  alue is the.** s
2a0c0 61 6d 65 20 61 73 20 74 68 61 74 20 63 75 72 72  ame as that curr
2a0d0 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20 76  ently bound to v
2a0e0 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20 6e 6f  ariable pVar, no
2a0f0 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
2a100 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ed..** Otherwise
2a110 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 73 20  , if the values 
2a120 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d 65  are not the same
2a130 20 6f 72 20 69 66 20 70 45 78 70 72 20 69 73 20   or if pExpr is 
2a140 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  not a simple.** 
2a150 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72 6f 20  SQL value, zero 
2a160 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2a170 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
2a180 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 50  ompareVariable(P
2a190 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
2a1a0 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72 20 2a  pr *pVar, Expr *
2a1b0 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65  pExpr){.  int re
2a1c0 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  s = 0;.  int iVa
2a1d0 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  r;.  sqlite3_val
2a1e0 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20 30 3b  ue *pL, *pR = 0;
2a1f0 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  .  .  sqlite3Val
2a200 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
2a210 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51  e->db, pExpr, SQ
2a220 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
2a230 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70 52 29  E_AFF_BLOB, &pR)
2a240 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a 20 20  ;.  if( pR ){.  
2a250 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d 3e 69    iVar = pVar->i
2a260 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
2a270 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
2a280 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  k(pParse->pVdbe,
2a290 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c 20 3d   iVar);.    pL =
2a2a0 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42   sqlite3VdbeGetB
2a2b0 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72 73 65  oundValue(pParse
2a2c0 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69 56  ->pReprepare, iV
2a2d0 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ar, SQLITE_AFF_B
2a2e0 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  LOB);.    if( pL
2a2f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
2a300 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2a310 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58  (pL)==SQLITE_TEX
2a320 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
2a330 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
2a340 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  pL); /* Make sur
2a350 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69  e the encoding i
2a360 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20  s UTF-8 */.     
2a370 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 20   }.      res =  
2a380 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  0==sqlite3MemCom
2a390 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30 29 3b  pare(pL, pR, 0);
2a3a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2a3b0 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 29 3b  e3ValueFree(pR);
2a3c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
2a3d0 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a  eFree(pL);.  }..
2a3e0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
2a3f0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
2a400 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
2a410 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
2a420 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ees.  Return 0 i
2a430 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
2a440 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d  ressions are com
2a450 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61  pletely identica
2a460 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  l.  Return 1 if 
2a470 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79  they differ only
2a480 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  .** by a COLLATE
2a490 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65   operator at the
2a4a0 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74   top level.  Ret
2a4b0 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61  urn 2 if there a
2a4c0 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a  re differences.*
2a4d0 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  * other than the
2a4e0 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41   top-level COLLA
2a4f0 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  TE operator..**.
2a500 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
2a510 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
2a520 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
2a530 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
2a540 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
2a550 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
2a560 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
2a570 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
2a580 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
2a590 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65  *.** The pA side
2a5a0 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20   might be using 
2a5b0 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66  TK_REGISTER.  If
2a5c0 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
2a5d0 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e  e and pB is.** n
2a5e0 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  ot using TK_REGI
2a5f0 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65  STER but is othe
2a600 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74  rwise equivalent
2a610 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74  , then still ret
2a620 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  urn 0..**.** Som
2a630 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
2a640 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
2a650 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  2 even if the tw
2a660 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
2a670 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
2a680 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
2a690 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
2a6a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
2a6b0 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
2a6c0 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a  l, we return 2 j
2a6d0 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
2a6e0 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
2a6f0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32  ine.** returns 2
2a700 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
2a710 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
2a720 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
2a730 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
2a740 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
2a750 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
2a760 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72  t a 0 or 1 retur
2a770 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
2a780 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
2a790 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
2a7a0 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
2a7b0 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
2a7c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2a7d0 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
2a7e0 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
2a7f0 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74  n extra 2 - that
2a800 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
2a810 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
2a820 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
2a830 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
2a840 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
2a850 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20  ct 0 or 1 could 
2a860 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
2a870 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
2a880 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55  pParse is not NU
2a890 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52 49 41  LL then TK_VARIA
2a8a0 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70 41 20  BLE terms in pA 
2a8b0 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20 69 6e  with bindings in
2a8c0 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52 65 70  .** pParse->pRep
2a8d0 72 65 70 61 72 65 20 63 61 6e 20 62 65 20 6d 61  repare can be ma
2a8e0 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 6c 69  tched against li
2a8f0 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20 20 54  terals in pB.  T
2a900 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70  he .** pParse->p
2a910 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 62 69  Vdbe->expmask bi
2a920 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74 65 64  tmask is updated
2a930 20 66 6f 72 20 65 61 63 68 20 76 61 72 69 61 62   for each variab
2a940 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a  le referenced..*
2a950 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 4e  * If pParse is N
2a960 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61 6c 20  ULL (the normal 
2a970 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79 20 54  case) then any T
2a980 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 20  K_VARIABLE term 
2a990 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  in .** Argument 
2a9a0 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20 6e 6f  pParse should no
2a9b0 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e 20  rmally be NULL. 
2a9c0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
2a9d0 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a 20 70  L and pA or.** p
2a9e0 42 20 63 61 75 73 65 73 20 61 20 72 65 74 75 72  B causes a retur
2a9f0 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f  n value of 2..*/
2aa00 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2aa10 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70  Compare(Parse *p
2aa20 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 41 2c  Parse, Expr *pA,
2aa30 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69   Expr *pB, int i
2aa40 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62  Tab){.  u32 comb
2aa50 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28  inedFlags;.  if(
2aa60 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
2aa70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
2aa80 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20  ==pA ? 0 : 2;.  
2aa90 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 20 26  }.  if( pParse &
2aaa0 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  & pA->op==TK_VAR
2aab0 49 41 42 4c 45 20 26 26 20 65 78 70 72 43 6f 6d  IABLE && exprCom
2aac0 70 61 72 65 56 61 72 69 61 62 6c 65 28 70 50 61  pareVariable(pPa
2aad0 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29 7b 0a  rse, pA, pB) ){.
2aae0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2aaf0 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  }.  combinedFlag
2ab00 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20  s = pA->flags | 
2ab10 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  pB->flags;.  if(
2ab20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
2ab30 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
2ab40 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61      if( (pA->fla
2ab50 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f  gs&pB->flags&EP_
2ab60 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20  IntValue)!=0 && 
2ab70 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42  pA->u.iValue==pB
2ab80 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20  ->u.iValue ){.  
2ab90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2aba0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
2abb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
2abc0 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20  op!=pB->op ){.  
2abd0 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
2abe0 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
2abf0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2ac00 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
2ac10 2c 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20  ,pB,iTab)<2 ){. 
2ac20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2ac30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d     }.    if( pB-
2ac40 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
2ac50 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
2ac60 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41  mpare(pParse, pA
2ac70 2c 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29  ,pB->pLeft,iTab)
2ac80 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
2ac90 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2aca0 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
2acb0 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
2acc0 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21  OLUMN && pA->op!
2acd0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26  =TK_AGG_COLUMN &
2ace0 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  & pA->u.zToken )
2acf0 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
2ad00 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  ==TK_FUNCTION ){
2ad10 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2ad20 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e  e3StrICmp(pA->u.
2ad30 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
2ad40 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ken)!=0 ) return
2ad50 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
2ad60 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pA->op==TK_COL
2ad70 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66  LATE ){.      if
2ad80 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
2ad90 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
2ada0 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
2adb0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2adc0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
2add0 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42  (pA->u.zToken,pB
2ade0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29  ->u.zToken)!=0 )
2adf0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  {.      return 2
2ae00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2ae10 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
2ae20 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
2ae30 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
2ae40 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
2ae50 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  2;.  if( ALWAYS(
2ae60 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
2ae70 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d   EP_TokenOnly)==
2ae80 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  0) ){.    if( co
2ae90 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
2aea0 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74  _xIsSelect ) ret
2aeb0 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 28  urn 2;.    if( (
2aec0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
2aed0 45 50 5f 46 69 78 65 64 43 6f 6c 29 3d 3d 30 0a  EP_FixedCol)==0.
2aee0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
2aef0 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2af00 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  e, pA->pLeft, pB
2af10 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29  ->pLeft, iTab) )
2af20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
2af30 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2af40 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41  mpare(pParse, pA
2af50 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
2af60 69 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65  ight, iTab) ) re
2af70 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
2af80 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
2af90 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69  ompare(pA->x.pLi
2afa0 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c  st, pB->x.pList,
2afb0 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
2afc0 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  2;.    assert( (
2afd0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
2afe0 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29  EP_Reduced)==0 )
2aff0 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  ;.    if( pA->op
2b000 21 3d 54 4b 5f 53 54 52 49 4e 47 20 26 26 20 70  !=TK_STRING && p
2b010 41 2d 3e 6f 70 21 3d 54 4b 5f 54 52 55 45 46 41  A->op!=TK_TRUEFA
2b020 4c 53 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  LSE ){.      if(
2b030 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42   pA->iColumn!=pB
2b040 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75  ->iColumn ) retu
2b050 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 2;.      if( 
2b060 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e  pA->iTable!=pB->
2b070 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26  iTable .       &
2b080 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69  & (pA->iTable!=i
2b090 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d  Tab || NEVER(pB-
2b0a0 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72  >iTable>=0)) ) r
2b0b0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 23  eturn 2;.    }.#
2b0c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b0d0 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
2b0e0 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69    /* Justificati
2b0f0 6f 6e 20 66 6f 72 20 74 68 65 20 61 73 73 65 72  on for the asser
2b100 74 28 29 3a 0a 20 20 20 20 2a 2a 20 77 69 6e 64  t():.    ** wind
2b110 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76  ow functions hav
2b120 65 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  e p->op==TK_FUNC
2b130 54 49 4f 4e 20 62 75 74 20 61 67 67 72 65 67 61  TION but aggrega
2b140 74 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20  te functions.   
2b150 20 2a 2a 20 68 61 76 65 20 70 2d 3e 6f 70 3d 3d   ** have p->op==
2b160 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e  TK_AGG_FUNCTION.
2b170 20 20 53 6f 20 61 6e 79 20 63 6f 6d 70 61 72 69    So any compari
2b180 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 6e 20 61  son between an a
2b190 67 67 72 65 67 61 74 65 0a 20 20 20 20 2a 2a 20  ggregate.    ** 
2b1a0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 61 20 77  function and a w
2b1b0 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 73  indow function s
2b1c0 68 6f 75 6c 64 20 68 61 76 65 20 66 61 69 6c 65  hould have faile
2b1d0 64 20 62 65 66 6f 72 65 20 72 65 61 63 68 69 6e  d before reachin
2b1e0 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f  g.    ** this po
2b1f0 69 6e 74 2e 20 20 41 6e 64 2c 20 69 74 20 69 73  int.  And, it is
2b200 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2b210 20 68 61 76 65 20 61 20 77 69 6e 64 6f 77 20 66   have a window f
2b220 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  unction and.    
2b230 2a 2a 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63  ** a scalar func
2b240 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73 61  tion with the sa
2b250 6d 65 20 6e 61 6d 65 20 61 6e 64 20 6e 75 6d 62  me name and numb
2b260 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
2b270 20 20 53 6f 0a 20 20 20 20 2a 2a 20 69 66 20 77    So.    ** if w
2b280 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
2b290 6e 74 2c 20 65 69 74 68 65 72 20 41 20 61 6e 64  nt, either A and
2b2a0 20 42 20 62 6f 74 68 20 77 69 6e 64 6f 77 20 66   B both window f
2b2b0 75 6e 63 74 69 6f 6e 73 20 6f 72 0a 20 20 20 20  unctions or.    
2b2c0 2a 2a 20 6e 65 69 74 68 65 72 20 61 72 65 20 61  ** neither are a
2b2d0 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
2b2e0 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  s. */.    assert
2b2f0 28 20 28 70 41 2d 3e 70 57 69 6e 3d 3d 30 29 3d  ( (pA->pWin==0)=
2b300 3d 28 70 42 2d 3e 70 57 69 6e 3d 3d 30 29 20 29  =(pB->pWin==0) )
2b310 3b 0a 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70  ;..    if( pA->p
2b320 57 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Win!=0 ){.      
2b330 69 66 28 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  if( sqlite3Windo
2b340 77 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  wCompare(pParse,
2b350 70 41 2d 3e 70 57 69 6e 2c 70 42 2d 3e 70 57 69  pA->pWin,pB->pWi
2b360 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32  n)!=0 ) return 2
2b370 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2b380 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2b390 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
2b3a0 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
2b3b0 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20  ects.  Return 0 
2b3c0 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
2b3d0 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f  tical and .** no
2b3e0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64  n-zero if they d
2b3f0 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
2b400 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
2b410 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
2b420 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
2b430 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
2b440 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
2b450 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
2b460 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
2b470 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
2b480 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
2b490 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ab..**.** This r
2b4a0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74  outine might ret
2b4b0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72  urn non-zero for
2b4c0 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72   equivalent Expr
2b4d0 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f  Lists.  The.** o
2b4e0 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  nly consequence 
2b4f0 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64  will be disabled
2b500 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20   optimizations. 
2b510 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
2b520 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20  e.** must never 
2b530 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
2b540 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
2b550 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65  ects are differe
2b560 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66  nt, or.** a malf
2b570 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  unction will res
2b580 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  ult..**.** Two N
2b590 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65  ULL pointers are
2b5a0 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
2b5b0 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
2b5c0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a   a NULL pointer.
2b5d0 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72  ** always differ
2b5e0 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c  s from a non-NUL
2b5f0 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  L pointer..*/.in
2b600 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  t sqlite3ExprLis
2b610 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73  tCompare(ExprLis
2b620 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20  t *pA, ExprList 
2b630 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
2b640 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
2b650 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20  A==0 && pB==0 ) 
2b660 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
2b670 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
2b680 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
2b690 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e   pA->nExpr!=pB->
2b6a0 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31  nExpr ) return 1
2b6b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2b6c0 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  A->nExpr; i++){.
2b6d0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41      Expr *pExprA
2b6e0 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pA->a[i].pExp
2b6f0 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  r;.    Expr *pEx
2b700 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70  prB = pB->a[i].p
2b710 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41  Expr;.    if( pA
2b720 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2b730 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  !=pB->a[i].sortO
2b740 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b  rder ) return 1;
2b750 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2b760 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70  ExprCompare(0, p
2b770 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69  ExprA, pExprB, i
2b780 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Tab) ) return 1;
2b790 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2b7a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73  .}../*.** Like s
2b7b0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2b7c0 65 28 29 20 65 78 63 65 70 74 20 43 4f 4c 4c 41  e() except COLLA
2b7d0 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 74 20  TE operators at 
2b7e0 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a  the top-level.**
2b7f0 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f   are ignored..*/
2b800 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2b810 43 6f 6d 70 61 72 65 53 6b 69 70 28 45 78 70 72  CompareSkip(Expr
2b820 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20   *pA, Expr *pB, 
2b830 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 72 65 74  int iTab){.  ret
2b840 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
2b850 6f 6d 70 61 72 65 28 30 2c 0a 20 20 20 20 20 20  ompare(0,.      
2b860 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2b870 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 41  prSkipCollate(pA
2b880 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2b890 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
2b8a0 6f 6c 6c 61 74 65 28 70 42 29 2c 0a 20 20 20 20  ollate(pB),.    
2b8b0 20 20 20 20 20 20 20 20 20 69 54 61 62 29 3b 0a           iTab);.
2b8c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2b8d0 74 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70  true if we can p
2b8e0 72 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c  rove the pE2 wil
2b8f0 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65  l always be true
2b900 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72   if pE1 is.** tr
2b910 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ue.  Return fals
2b920 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63  e if we cannot c
2b930 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f  omplete the proo
2b940 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68  f or if pE2 migh
2b950 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20  t.** be false.  
2b960 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
2b970 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20      pE1: x==5   
2b980 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
2b990 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
2b9a0 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
2b9b0 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45  1: x>0        pE
2b9c0 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20  2: x==5         
2b9d0 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73      Result: fals
2b9e0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d  e.**     pE1: x=
2b9f0 32 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  21       pE2: x=
2ba00 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52  21 OR y=43     R
2ba10 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2ba20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20     pE1: x!=123  
2ba30 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
2ba40 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
2ba50 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
2ba60 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32  : x!=?1      pE2
2ba70 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2ba80 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
2ba90 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53  **     pE1: x IS
2baa0 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53   NULL  pE2: x IS
2bab0 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
2bac0 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
2bad0 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20    pE1: x IS ?2  
2bae0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
2baf0 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20  NULL    Reuslt: 
2bb00 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  false.**.** When
2bb10 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f   comparing TK_CO
2bb20 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65  LUMN nodes betwe
2bb30 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20  en pE1 and pE2, 
2bb40 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78  if pE2 has.** Ex
2bb50 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e  pr.iTable<0 then
2bb60 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20   assume a table 
2bb70 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20  number given by 
2bb80 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  iTab..**.** If p
2bb90 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c  Parse is not NUL
2bba0 4c 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  L, then the valu
2bbb0 65 73 20 6f 66 20 62 6f 75 6e 64 20 76 61 72 69  es of bound vari
2bbc0 61 62 6c 65 73 20 69 6e 20 70 45 31 20 61 72 65  ables in pE1 are
2bbd0 20 0a 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61 67   .** compared ag
2bbe0 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 20 76 61  ainst literal va
2bbf0 6c 75 65 73 20 69 6e 20 70 45 32 20 61 6e 64 20  lues in pE2 and 
2bc00 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65  pParse->pVdbe->e
2bc10 78 70 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64  xpmask is.** mod
2bc20 69 66 69 65 64 20 74 6f 20 72 65 63 6f 72 64 20  ified to record 
2bc30 77 68 69 63 68 20 62 6f 75 6e 64 20 76 61 72 69  which bound vari
2bc40 61 62 6c 65 73 20 61 72 65 20 72 65 66 65 72 65  ables are refere
2bc50 6e 63 65 64 2e 20 20 49 66 20 70 50 61 72 73 65  nced.  If pParse
2bc60 20 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68   .** is NULL, th
2bc70 65 6e 20 66 61 6c 73 65 20 77 69 6c 6c 20 62 65  en false will be
2bc80 20 72 65 74 75 72 6e 65 64 20 69 66 20 70 45 31   returned if pE1
2bc90 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f   contains any bo
2bca0 75 6e 64 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  und variables..*
2bcb0 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75  *.** When in dou
2bcc0 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  bt, return false
2bcd0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75  .  Returning tru
2bce0 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  e might give a p
2bcf0 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d  erformance.** im
2bd00 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75  provement.  Retu
2bd10 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68  rning false migh
2bd20 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72  t cause a perfor
2bd30 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c  mance reduction,
2bd40 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20   but.** it will 
2bd50 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20  always give the 
2bd60 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61  correct answer a
2bd70 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61  nd is hence alwa
2bd80 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20  ys safe..*/.int 
2bd90 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2bda0 65 73 45 78 70 72 28 50 61 72 73 65 20 2a 70 50  esExpr(Parse *pP
2bdb0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c  arse, Expr *pE1,
2bdc0 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20   Expr *pE2, int 
2bdd0 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c  iTab){.  if( sql
2bde0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2bdf0 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2be00 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , iTab)==0 ){.  
2be10 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2be20 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
2be30 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69  K_OR.   && (sqli
2be40 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
2be50 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20  pr(pParse, pE1, 
2be60 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
2be70 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  ).             |
2be80 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  | sqlite3ExprImp
2be90 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c  liesExpr(pParse,
2bea0 20 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68   pE1, pE2->pRigh
2beb0 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a  t, iTab) ).  ){.
2bec0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2bed0 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d  }.  if( pE2->op=
2bee0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70  =TK_NOTNULL && p
2bef0 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  E1->op!=TK_ISNUL
2bf00 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
2bf10 5f 49 53 20 29 7b 0a 20 20 20 20 45 78 70 72 20  _IS ){.    Expr 
2bf20 2a 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78 70  *pX = sqlite3Exp
2bf30 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 31  rSkipCollate(pE1
2bf40 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 74 65  ->pLeft);.    te
2bf50 73 74 63 61 73 65 28 20 70 58 21 3d 70 45 31 2d  stcase( pX!=pE1-
2bf60 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 69 66  >pLeft );.    if
2bf70 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2bf80 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 58 2c  pare(pParse, pX,
2bf90 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
2bfa0 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  b)==0 ) return 1
2bfb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2bfc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2bfd0 69 73 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  is the Expr node
2bfe0 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71   callback for sq
2bff0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2c000 4e 6f 74 4e 75 6c 6c 52 6f 77 28 29 2e 0a 2a 2a  NotNullRow()..**
2c010 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
2c020 6f 6e 20 6e 6f 64 65 20 72 65 71 75 69 72 65 73  on node requires
2c030 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
2c040 61 74 20 70 57 61 6c 6b 65 72 2d 3e 69 43 75 72  at pWalker->iCur
2c050 0a 2a 2a 20 68 61 76 65 20 61 20 6e 6f 6e 2d 4e  .** have a non-N
2c060 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  ULL column, then
2c070 20 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43   set pWalker->eC
2c080 6f 64 65 20 74 6f 20 31 20 61 6e 64 20 61 62 6f  ode to 1 and abo
2c090 72 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rt..*/.static in
2c0a0 74 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  t impliesNotNull
2c0b0 52 6f 77 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  Row(Walker *pWal
2c0c0 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2c0d0 29 7b 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ){.  /* This rou
2c0e0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
2c0f0 6c 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  led for WHERE cl
2c100 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 73  ause expressions
2c110 20 61 6e 64 20 73 6f 20 69 74 0a 20 20 2a 2a 20   and so it.  ** 
2c120 63 61 6e 6e 6f 74 20 68 61 76 65 20 61 6e 79 20  cannot have any 
2c130 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 65 6e  TK_AGG_COLUMN en
2c140 74 72 69 65 73 20 62 65 63 61 75 73 65 20 74 68  tries because th
2c150 6f 73 65 20 61 72 65 20 6f 6e 6c 79 20 66 6f 75  ose are only fou
2c160 6e 64 0a 20 20 2a 2a 20 69 6e 20 48 41 56 49 4e  nd.  ** in HAVIN
2c170 47 20 63 6c 61 75 73 65 73 2e 20 20 57 65 20 63  G clauses.  We c
2c180 61 6e 20 67 65 74 20 61 20 54 4b 5f 41 47 47 5f  an get a TK_AGG_
2c190 46 55 4e 43 54 49 4f 4e 20 69 6e 20 61 20 57 48  FUNCTION in a WH
2c1a0 45 52 45 20 63 6c 61 75 73 65 2c 0a 20 20 2a 2a  ERE clause,.  **
2c1b0 20 62 75 74 20 74 68 61 74 20 69 73 20 61 6e 20   but that is an 
2c1c0 69 6c 6c 65 67 61 6c 20 63 6f 6e 73 74 72 75 63  illegal construc
2c1d0 74 20 61 6e 64 20 74 68 65 20 71 75 65 72 79 20  t and the query 
2c1e0 77 69 6c 6c 20 62 65 20 72 65 6a 65 63 74 65 64  will be rejected
2c1f0 20 61 74 0a 20 20 2a 2a 20 61 20 6c 61 74 65 72   at.  ** a later
2c200 20 73 74 61 67 65 20 6f 66 20 70 72 6f 63 65 73   stage of proces
2c210 73 69 6e 67 2c 20 73 6f 20 74 68 65 20 54 4b 5f  sing, so the TK_
2c220 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 63 61 73  AGG_FUNCTION cas
2c230 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  e does not.  ** 
2c240 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69  need to be consi
2c250 64 65 72 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20  dered here. */. 
2c260 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
2c270 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
2c280 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  N );.  testcase(
2c290 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2c2a0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 0a  GG_FUNCTION );..
2c2b0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
2c2c0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2c2d0 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
2c2e0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2c2f0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
2c300 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
2c310 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  _ISNOT:.    case
2c320 20 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73   TK_NOT:.    cas
2c330 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
2c340 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
2c350 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
2c360 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20   case TK_CASE:. 
2c370 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20     case TK_IN:. 
2c380 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
2c390 49 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63  ION:.      testc
2c3a0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2c3b0 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
2c3c0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2c3d0 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b  r->op==TK_NOT );
2c3e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2c3f0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
2c400 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
2c410 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2c420 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
2c430 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2c440 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  pr->op==TK_OR );
2c450 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2c460 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
2c470 41 53 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ASE );.      tes
2c480 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c490 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20  ==TK_IN );.     
2c4a0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2c4b0 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
2c4c0 4e 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  N );.      retur
2c4d0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
2c4e0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
2c4f0 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
2c500 65 72 2d 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70  er->u.iCur==pExp
2c510 72 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  r->iTable ){.   
2c520 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
2c530 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
2c540 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2c550 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
2c560 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2c570 65 3b 0a 0a 20 20 20 20 2f 2a 20 56 69 72 74 75  e;..    /* Virtu
2c580 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c  al tables are al
2c590 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 63 6f 6e  lowed to use con
2c5a0 73 74 72 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d  straints like x=
2c5b0 4e 55 4c 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  NULL.  So.    **
2c5c0 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
2c5d0 6f 72 6d 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74  orm x=y does not
2c5e0 20 70 72 6f 76 65 20 74 68 61 74 20 79 20 69 73   prove that y is
2c5f0 20 6e 6f 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20   not null if x. 
2c600 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c     ** is the col
2c610 75 6d 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c  umn of a virtual
2c620 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61   table */.    ca
2c630 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61  se TK_EQ:.    ca
2c640 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
2c650 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
2c660 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
2c670 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
2c680 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20  se TK_GE:.      
2c690 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c6a0 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20  >op==TK_EQ );.  
2c6b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c6c0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29  xpr->op==TK_NE )
2c6d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2c6e0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c6f0 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
2c700 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c710 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
2c720 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c730 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20  >op==TK_GT );.  
2c740 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c750 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29  xpr->op==TK_GE )
2c760 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 45 78  ;.      if( (pEx
2c770 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
2c780 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69  K_COLUMN && IsVi
2c790 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65  rtual(pExpr->pLe
2c7a0 66 74 2d 3e 70 54 61 62 29 29 0a 20 20 20 20 20  ft->pTab)).     
2c7b0 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70 52 69    || (pExpr->pRi
2c7c0 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ght->op==TK_COLU
2c7d0 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28  MN && IsVirtual(
2c7e0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70  pExpr->pRight->p
2c7f0 54 61 62 29 29 0a 20 20 20 20 20 20 29 7b 0a 20  Tab)).      ){. 
2c800 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2c810 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
2c820 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
2c830 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
2c840 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ntinue;.  }.}../
2c850 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2c860 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 65   (non-zero) if e
2c870 78 70 72 65 73 73 69 6f 6e 20 70 20 63 61 6e 20  xpression p can 
2c880 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69 66 20  only be true if 
2c890 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20  at least.** one 
2c8a0 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
2c8b0 69 54 61 62 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c  iTab is non-null
2c8c0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
2c8d0 73 2c 20 72 65 74 75 72 6e 20 74 72 75 65 0a 2a  s, return true.*
2c8e0 2a 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20  * if expression 
2c8f0 70 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  p will always be
2c900 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20 69   NULL or false i
2c910 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f  f every column o
2c920 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c  f iTab.** is NUL
2c930 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 6e  L..**.** False n
2c940 65 67 61 74 69 76 65 73 20 61 72 65 20 61 63 63  egatives are acc
2c950 65 70 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68  eptable.  In oth
2c960 65 72 20 77 6f 72 64 73 2c 20 69 74 20 69 73 20  er words, it is 
2c970 6f 6b 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20  ok to return.** 
2c980 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 65 78 70  zero even if exp
2c990 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 6e  ression p will n
2c9a0 65 76 65 72 20 62 65 20 74 72 75 65 20 6f 66 20  ever be true of 
2c9b0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  every column of 
2c9c0 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e  iTab.** is NULL.
2c9d0 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69    A false negati
2c9e0 76 65 20 69 73 20 6d 65 72 65 6c 79 20 61 20 6d  ve is merely a m
2c9f0 69 73 73 65 64 20 6f 70 74 69 6d 69 7a 61 74 69  issed optimizati
2ca00 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a  on opportunity..
2ca10 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 70 6f 73 69  **.** False posi
2ca20 74 69 76 65 73 20 61 72 65 20 6e 6f 74 20 61 6c  tives are not al
2ca30 6c 6f 77 65 64 2c 20 68 6f 77 65 76 65 72 2e 20  lowed, however. 
2ca40 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   A false positiv
2ca50 65 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20  e may result.** 
2ca60 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  in an incorrect 
2ca70 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 65  answer..**.** Te
2ca80 72 6d 73 20 6f 66 20 70 20 74 68 61 74 20 61 72  rms of p that ar
2ca90 65 20 6d 61 72 6b 65 64 20 77 69 74 68 20 45 50  e marked with EP
2caa0 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64 20 68  _FromJoin (and h
2cab0 65 6e 63 65 20 74 68 61 74 20 63 6f 6d 65 20 66  ence that come f
2cac0 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  rom.** the ON or
2cad0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
2cae0 66 20 4c 45 46 54 20 4a 4f 49 4e 53 29 20 61 72  f LEFT JOINS) ar
2caf0 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20  e excluded from 
2cb00 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a  the analysis..**
2cb10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2cb20 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63   is used to chec
2cb30 6b 20 69 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  k if a LEFT JOIN
2cb40 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65   can be converte
2cb50 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64  d into.** an ord
2cb60 69 6e 61 72 79 20 4a 4f 49 4e 2e 20 20 54 68 65  inary JOIN.  The
2cb70 20 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74   p argument is t
2cb80 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
2cb90 20 20 49 66 20 74 68 65 20 57 48 45 52 45 0a 2a    If the WHERE.*
2cba0 2a 20 63 6c 61 75 73 65 20 72 65 71 75 69 72 65  * clause require
2cbb0 73 20 74 68 61 74 20 73 6f 6d 65 20 63 6f 6c 75  s that some colu
2cbc0 6d 6e 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  mn of the right 
2cbd0 74 61 62 6c 65 20 6f 66 20 74 68 65 20 4c 45 46  table of the LEF
2cbe0 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e 6f 6e  T JOIN.** be non
2cbf0 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20  -NULL, then the 
2cc00 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65  LEFT JOIN can be
2cc10 20 73 61 66 65 6c 79 20 63 6f 6e 76 65 72 74 65   safely converte
2cc20 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f 72 64  d into an.** ord
2cc30 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a 69  inary join..*/.i
2cc40 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  nt sqlite3ExprIm
2cc50 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28  pliesNonNullRow(
2cc60 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
2cc70 62 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  b){.  Walker w;.
2cc80 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2cc90 6b 20 3d 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75  k = impliesNotNu
2cca0 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78 53 65 6c 65  llRow;.  w.xSele
2ccb0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ctCallback = 0;.
2ccc0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2ccd0 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 65 43  ack2 = 0;.  w.eC
2cce0 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 69  ode = 0;.  w.u.i
2ccf0 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 73 71  Cur = iTab;.  sq
2cd00 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
2cd10 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
2cd20 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
2cd30 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2cd40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2cd50 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
2cd60 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
2cd70 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  er.** to determi
2cd80 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65 73 73  ne if an express
2cd90 69 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c 75  ion can be evalu
2cda0 61 74 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  ated by referenc
2cdb0 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65  e to the.** inde
2cdc0 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20  x only, without 
2cdd0 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20 73  having to do a s
2cde0 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 63 6f  earch for the co
2cdf0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
2ce00 61 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68 65  able entry.  The
2ce10 20 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20 66   IdxCover.pIdx f
2ce20 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64 65  ield is the inde
2ce30 78 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43 75  x.  IdxCover.iCu
2ce40 72 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72 73  r.** is the curs
2ce50 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
2ce60 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 43  ..*/.struct IdxC
2ce70 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a  over {.  Index *
2ce80 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65  pIdx;     /* The
2ce90 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73   index to be tes
2cea0 74 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65  ted for coverage
2ceb0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
2cec0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
2ced0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2cee0 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
2cef0 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
2cf00 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68   */.};../*.** Ch
2cf10 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
2cf20 65 72 65 20 61 72 65 20 72 65 66 65 72 65 6e 63  ere are referenc
2cf30 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
2cf40 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b   table .** pWalk
2cf50 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2cf60 3e 69 43 75 72 20 63 61 6e 20 62 65 20 73 61 74  >iCur can be sat
2cf70 69 73 66 69 65 64 20 75 73 69 6e 67 20 74 68 65  isfied using the
2cf80 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65   index.** pWalke
2cf90 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
2cfa0 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
2cfb0 69 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65 72  int exprIdxCover
2cfc0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2cfd0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2cfe0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
2cff0 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26  =TK_COLUMN.   &&
2d000 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
2d010 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2d020 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26 26  over->iCur.   &&
2d030 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
2d040 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75  Index(pWalker->u
2d050 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78  .pIdxCover->pIdx
2d060 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
2d070 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61  )<0.  ){.    pWa
2d080 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
2d090 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
2d0a0 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Abort;.  }.  ret
2d0b0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2d0c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
2d0d0 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65 78  mine if an index
2d0e0 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20 77   pIdx on table w
2d0f0 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72 20  ith cursor iCur 
2d100 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a  contains will.**
2d110 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2d120 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20 74  pExpr.  Return t
2d130 72 75 65 20 69 66 20 74 68 65 20 69 6e 64 65 78  rue if the index
2d140 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65 0a   does cover the.
2d150 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
2d160 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 70  d false if the p
2d170 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
2d180 72 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c 65  references table
2d190 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74   columns.** that
2d1a0 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69   are not found i
2d1b0 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78  n the index pIdx
2d1c0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78  ..**.** An index
2d1d0 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78 70   covering an exp
2d1e0 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68  ression means th
2d1f0 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
2d200 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c  n can be.** eval
2d210 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79  uated using only
2d220 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 77   the index and w
2d230 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
2d240 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63   lookup the.** c
2d250 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
2d260 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74  le entry..*/.int
2d270 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65   sqlite3ExprCove
2d280 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45 78  redByIndex(.  Ex
2d290 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
2d2a0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
2d2b0 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a 20  o be tested */. 
2d2c0 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
2d2d0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
2d2e0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
2d2f0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2d300 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78  table */.  Index
2d310 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
2d320 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74  * The index that
2d330 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 66   might be used f
2d340 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29  or coverage */.)
2d350 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2d360 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20  struct IdxCover 
2d370 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26  xcov;.  memset(&
2d380 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
2d390 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d 20  ;.  xcov.iCur = 
2d3a0 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64  iCur;.  xcov.pId
2d3b0 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78 45  x = pIdx;.  w.xE
2d3c0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
2d3d0 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e  prIdxCover;.  w.
2d3e0 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26 78  u.pIdxCover = &x
2d3f0 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  cov;.  sqlite3Wa
2d400 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
2d410 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e 65  );.  return !w.e
2d420 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Code;.}.../*.** 
2d430 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
2d440 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2d450 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62  ucture is used b
2d460 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65  y the tree walke
2d470 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65  r.** to count re
2d480 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c  ferences to tabl
2d490 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
2d4a0 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e   arguments of an
2d4b0 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66   .** aggregate f
2d4c0 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65  unction, in orde
2d4d0 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  r to implement t
2d4e0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e  he.** sqlite3Fun
2d4f0 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72  ctionThisSrc() r
2d500 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
2d510 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53  t SrcCount {.  S
2d520 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
2d530 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61  /* One particula
2d540 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  r FROM clause in
2d550 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79 20   a nested query 
2d560 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20  */.  int nThis; 
2d570 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d580 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2d590 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63   columns in pSrc
2d5a0 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  List */.  int nO
2d5b0 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75  ther;      /* Nu
2d5c0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2d5d0 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
2d5e0 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
2d5f0 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ses */.};../*.**
2d600 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
2d610 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2d620 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  to columns..*/.s
2d630 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 72  tatic int exprSr
2d640 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70  cCount(Walker *p
2d650 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2d660 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e  xpr){.  /* The N
2d670 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65  EVER() on the se
2d680 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63  cond term is bec
2d690 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63  ause sqlite3Func
2d6a0 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2d6b0 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  ).  ** is always
2d6c0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73   called before s
2d6d0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2d6e0 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61 6e  eAggregates() an
2d6f0 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b  d so the.  ** TK
2d700 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f  _COLUMNs have no
2d710 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65  t yet been conve
2d720 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47  rted into TK_AGG
2d730 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a  _COLUMN.  If.  *
2d740 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
2d750 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20 69  nUsesThisSrc() i
2d760 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74  s used different
2d770 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  ly in the future
2d780 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52  , the.  ** NEVER
2d790 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  () will need to 
2d7a0 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20  be removed. */. 
2d7b0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
2d7c0 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56  TK_COLUMN || NEV
2d7d0 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  ER(pExpr->op==TK
2d7e0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a  _AGG_COLUMN) ){.
2d7f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
2d800 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a  truct SrcCount *
2d810 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
2d820 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72  SrcCount;.    Sr
2d830 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
2d840 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e  >pSrc;.    int n
2d850 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72  Src = pSrc ? pSr
2d860 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20  c->nSrc : 0;.   
2d870 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63   for(i=0; i<nSrc
2d880 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2d890 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
2d8a0 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  =pSrc->a[i].iCur
2d8b0 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
2d8c0 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72   }.    if( i<nSr
2d8d0 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54  c ){.      p->nT
2d8e0 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  his++;.    }else
2d8f0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65  {.      p->nOthe
2d900 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  r++;.    }.  }. 
2d910 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2d920 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  inue;.}../*.** D
2d930 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20  etermine if any 
2d940 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  of the arguments
2d950 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46 75   to the pExpr Fu
2d960 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  nction reference
2d970 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52  .** pSrcList.  R
2d980 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2d990 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74  ey do.  Also ret
2d9a0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
2d9b0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
2d9c0 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20  no arguments or 
2d9d0 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e  has only constan
2d9e0 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
2d9f0 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45  turn false if pE
2da00 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  xpr.** reference
2da10 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f  s columns but no
2da20 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62  t columns of tab
2da30 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72  les found in pSr
2da40 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cList..*/.int sq
2da50 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
2da60 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a 70  sThisSrc(Expr *p
2da70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70  Expr, SrcList *p
2da80 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b  SrcList){.  Walk
2da90 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53  er w;.  struct S
2daa0 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61  rcCount cnt;.  a
2dab0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
2dac0 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
2dad0 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  N );.  w.xExprCa
2dae0 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63  llback = exprSrc
2daf0 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65  Count;.  w.xSele
2db00 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ctCallback = 0;.
2db10 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20    w.u.pSrcCount 
2db20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53  = &cnt;.  cnt.pS
2db30 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20  rc = pSrcList;. 
2db40 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a   cnt.nThis = 0;.
2db50 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30    cnt.nOther = 0
2db60 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2db70 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70  xprList(&w, pExp
2db80 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72  r->x.pList);.  r
2db90 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e  eturn cnt.nThis>
2dba0 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d  0 || cnt.nOther=
2dbb0 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  =0;.}../*.** Add
2dbc0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
2dbd0 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
2dbe0 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52  aCol[] array.  R
2dbf0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
2dc00 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
2dc10 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
2dc20 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
2dc30 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
2dc40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2dc50 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
2dc60 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
2dc70 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
2dc80 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
2dc90 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41  >aCol = sqlite3A
2dca0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
2dcb0 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20       db,.       
2dcc0 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20  pInfo->aCol,.   
2dcd0 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
2dce0 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20  ->aCol[0]),.    
2dcf0 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
2dd00 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  mn,.       &i.  
2dd10 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
2dd20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
2dd30 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
2dd40 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
2dd50 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
2dd60 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
2dd70 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
2dd80 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
2dd90 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
2dda0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
2ddb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ddc0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
2ddd0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
2dde0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
2ddf0 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
2de00 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
2de10 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
2de20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
2de30 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
2de40 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
2de50 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
2de60 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
2de70 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  nc,.       &i.  
2de80 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
2de90 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
2dea0 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c   is the xExprCal
2deb0 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65  lback for a tree
2dec0 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20   walker.  It is 
2ded0 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  used to.** imple
2dee0 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  ment sqlite3Expr
2def0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2df00 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
2df10 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2df20 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
2df30 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
2df40 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2df50 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
2df60 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61  gate(Walker *pWa
2df70 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
2df80 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  r){.  int i;.  N
2df90 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
2dfa0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
2dfb0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
2dfc0 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
2dfd0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2dfe0 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
2dff0 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20  List;.  AggInfo 
2e000 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d  *pAggInfo = pNC-
2e010 3e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 3b 0a 0a  >uNC.pAggInfo;..
2e020 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e    assert( pNC->n
2e030 63 46 6c 61 67 73 20 26 20 4e 43 5f 55 41 67 67  cFlags & NC_UAgg
2e040 49 6e 66 6f 20 29 3b 0a 20 20 73 77 69 74 63 68  Info );.  switch
2e050 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
2e060 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
2e070 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
2e080 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
2e090 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2e0a0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
2e0b0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
2e0c0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2e0d0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
2e0e0 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
2e0f0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f  to see if the co
2e100 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f  lumn is in one o
2e110 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
2e120 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a  the FROM.      *
2e130 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
2e140 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
2e150 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
2e160 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29  AYS(pSrcList!=0)
2e170 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
2e180 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2e190 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73  *pItem = pSrcLis
2e1a0 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f  t->a;.        fo
2e1b0 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73  r(i=0; i<pSrcLis
2e1c0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
2e1d0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2e1e0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2e1f0 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  _col *pCol;.    
2e200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2e210 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2e220 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
2e230 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
2e240 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e250 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
2e260 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
2e270 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2e280 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
2e290 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
2e2a0 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
2e2b0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
2e2c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
2e2d0 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
2e2e0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
2e2f0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
2e300 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
2e310 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2e320 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
2e330 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
2e340 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
2e350 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
2e360 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
2e370 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
2e380 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
2e390 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2e3a0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
2e3b0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
2e3c0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
2e3d0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
2e3e0 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
2e3f0 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
2e400 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2e410 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
2e420 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
2e430 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
2e440 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
2e450 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
2e460 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
2e470 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2e490 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e4a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
2e4b0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
2e4c0 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
2e4d0 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
2e4e0 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
2e4f0 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
2e500 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
2e510 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2e520 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
2e530 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
2e540 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2e550 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
2e560 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
2e570 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
2e580 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
2e590 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e5a0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
2e5b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
2e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2e5d0 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
2e5e0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2e5f0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2e600 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
2e610 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
2e620 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
2e630 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2e640 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
2e650 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
2e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
2e670 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
2e680 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
2e690 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
2e6a0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
2e6c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2e6d0 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
2e6e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e6f0 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
2e700 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e710 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
2e720 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
2e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e740 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
2e750 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
2e760 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e770 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
2e780 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
2e790 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
2e7a0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
2e7b0 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
2e7c0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
2e7d0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
2e7e0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2e7f0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
2e800 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
2e810 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e830 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2e840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e850 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e860 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
2e870 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e890 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2e8a0 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
2e8b0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
2e8c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e8d0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2e8e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2e8f0 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
2e900 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
2e910 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
2e920 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
2e930 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
2e940 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
2e950 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
2e960 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
2e970 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
2e980 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
2e990 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
2e9a0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
2e9b0 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
2e9c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
2e9d0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
2e9e0 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
2e9f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
2ea00 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
2ea10 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
2ea20 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
2ea30 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2ea40 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2ea50 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
2ea60 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
2ea70 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
2ea80 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
2ea90 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20  = (i16)k;.      
2eaa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2eab0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69         } /* endi
2eac0 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  f pExpr->iTable=
2ead0 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
2eae0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  */.        } /* 
2eaf0 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53  end loop over pS
2eb00 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  rcList */.      
2eb10 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
2eb20 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
2eb30 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
2eb40 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
2eb50 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
2eb60 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75  ags & NC_InAggFu
2eb70 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  nc)==0.       &&
2eb80 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
2eb90 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70  Depth==pExpr->op
2eba0 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  2.      ){.     
2ebb0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
2ebc0 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
2ebd0 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
2ebe0 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
2ebf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
2ec00 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
2ec10 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
2ec20 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
2ec30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ec40 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2ec50 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
2ec60 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
2ec70 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2ec80 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2ec90 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
2eca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2ecb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2ecc0 61 72 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 45  are(0, pItem->pE
2ecd0 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d  xpr, pExpr, -1)=
2ece0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2ecf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2ed00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2ed10 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41         if( i>=pA
2ed20 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b  ggInfo->nFunc ){
2ed30 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45  .          /* pE
2ed40 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e  xpr is original.
2ed50 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74    Make a new ent
2ed60 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  ry in pAggInfo->
2ed70 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20  aFunc[].        
2ed80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
2ed90 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
2eda0 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  se->db);.       
2edb0 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66     i = addAggInf
2edc0 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62  oFunc(pParse->db
2edd0 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20  , pAggInfo);.   
2ede0 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
2edf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2ee00 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2ee10 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2ee20 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2ee30 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2ee40 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  m = &pAggInfo->a
2ee50 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Func[i];.       
2ee60 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70       pItem->pExp
2ee70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
2ee80 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d         pItem->iM
2ee90 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
2eea0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
2eeb0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2eec0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2eed0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
2eee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2eef0 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69  em->pFunc = sqli
2ef00 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
2ef10 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
2ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2ef30 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
2ef40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ef50 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69      pExpr->x.pLi
2ef60 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st ? pExpr->x.pL
2ef70 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
2ef80 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
2ef90 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
2efa0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
2efb0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
2efc0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
2efd0 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
2efe0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
2eff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f000 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2f010 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
2f020 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2f030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f040 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
2f050 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
2f060 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
2f070 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
2f080 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
2f090 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
2f0a0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2f0b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2f0c0 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2f0d0 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
2f0e0 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2f0f0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
2f100 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
2f110 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
2f120 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20  (i16)i;.        
2f130 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
2f140 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
2f150 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2f160 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rune;.      }els
2f170 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
2f180 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2f190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f1a0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2f1b0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
2f1c0 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
2f1d0 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28  regatesInSelect(
2f1e0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2f1f0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2f200 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2f210 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a  METER(pSelect);.
2f220 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65    pWalker->walke
2f230 72 44 65 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75  rDepth++;.  retu
2f240 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2f250 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
2f260 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2f270 49 6e 53 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b  InSelectEnd(Walk
2f280 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2f290 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
2f2a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2f2b0 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57  R(pSelect);.  pW
2f2c0 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
2f2d0 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  th--;.}../*.** A
2f2e0 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72  nalyze the pExpr
2f2f0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
2f300 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
2f310 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
2f320 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
2f330 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
2f340 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66   added to AggInf
2f350 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e  o object that pN
2f360 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70  C->pAggInfo.** p
2f370 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74  oints to.  Addit
2f380 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72  ional entries ar
2f390 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67  e made on the Ag
2f3a0 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a  gInfo object as.
2f3b0 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  ** necessary..**
2f3c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f3d0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2f3e0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
2f3f0 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2f400 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
2f410 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   by sqlite3Resol
2f420 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a  veExprNames()..*
2f430 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2f440 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2f450 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
2f460 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
2f470 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
2f480 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2f490 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
2f4a0 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63  gate;.  w.xSelec
2f4b0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  tCallback = anal
2f4c0 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2f4d0 65 6c 65 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65  elect;.  w.xSele
2f4e0 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e  ctCallback2 = an
2f4f0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
2f500 6e 53 65 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e  nSelectEnd;.  w.
2f510 77 61 6c 6b 65 72 44 65 70 74 68 20 3d 20 30 3b  walkerDepth = 0;
2f520 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43  .  w.u.pNC = pNC
2f530 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ;.  assert( pNC-
2f540 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a  >pSrcList!=0 );.
2f550 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
2f560 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
2f570 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
2f580 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2f590 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65  gregates() for e
2f5a0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
2f5b0 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73  in an.** express
2f5c0 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ion list.  Retur
2f5d0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2f5e0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  errors..**.** If
2f5f0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75   an error is fou
2f600 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  nd, the analysis
2f610 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a   is cut short..*
2f620 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2f630 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2f640 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
2f650 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  C, ExprList *pLi
2f660 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  st){.  struct Ex
2f670 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
2f680 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
2f690 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
2f6a0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
2f6b0 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
2f6c0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
2f6d0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  tem++){.      sq
2f6e0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2f6f0 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20  Aggregates(pNC, 
2f700 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
2f710 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2f720 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e  * Allocate a sin
2f730 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72  gle new register
2f740 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64   for use to hold
2f750 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61   some intermedia
2f760 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e  te result..*/.in
2f770 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
2f780 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
2f790 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
2f7a0 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b  ->nTempReg==0 ){
2f7b0 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50  .    return ++pP
2f7c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a  arse->nMem;.  }.
2f7d0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
2f7e0 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72  >aTempReg[--pPar
2f7f0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d  se->nTempReg];.}
2f800 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
2f810 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d  te a register, m
2f820 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20  aking available 
2f830 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f  for reuse for so
2f840 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70  me other.** purp
2f850 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ose..**.** If a 
2f860 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72  register is curr
2f870 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64  ently being used
2f880 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   by the column c
2f890 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  ache, then.** th
2f8a0 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  e deallocation i
2f8b0 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
2f8c0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
2f8d0 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73  e line that uses
2f8e0 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
2f8f0 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a   becomes stale..
2f900 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
2f910 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61  eleaseTempReg(Pa
2f920 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2f930 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52   iReg){.  if( iR
2f940 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  eg && pParse->nT
2f950 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
2f960 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
2f970 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  g) ){.    int i;
2f980 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c  .    struct yCol
2f990 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f  Cache *p;.    fo
2f9a0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
2f9b0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50  >aColCache; i<pP
2f9c0 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
2f9d0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
2f9e0 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69    if( p->iReg==i
2f9f0 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Reg ){.        p
2fa00 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20  ->tempReg = 1;. 
2fa10 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
2fa20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2fa30 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2fa40 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
2fa50 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20  eg++] = iReg;.  
2fa60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
2fa70 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
2fa80 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65  e a block of nRe
2fa90 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65  g consecutive re
2faa0 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20  gisters..*/.int 
2fab0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
2fac0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2fad0 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
2fae0 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
2faf0 6e 52 65 67 3d 3d 31 20 29 20 72 65 74 75 72 6e  nReg==1 ) return
2fb00 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2fb10 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 20  eg(pParse);.  i 
2fb20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  = pParse->iRange
2fb30 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73  Reg;.  n = pPars
2fb40 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->nRangeReg;.  
2fb50 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20  if( nReg<=n ){. 
2fb60 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65 64     assert( !used
2fb70 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
2fb80 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20  arse, i, i+n-1) 
2fb90 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
2fba0 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67  RangeReg += nReg
2fbb0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  ;.    pParse->nR
2fbc0 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b  angeReg -= nReg;
2fbd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20  .  }else{.    i 
2fbe0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
2fbf0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
2fc00 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a  em += nReg;.  }.
2fc10 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f    return i;.}.vo
2fc20 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
2fc30 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  eTempRange(Parse
2fc40 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
2fc50 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
2fc60 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
2fc70 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2fc80 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
2fc90 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74  , iReg);.    ret
2fca0 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
2fcb0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
2fcc0 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
2fcd0 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65  nReg);.  if( nRe
2fce0 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g>pParse->nRange
2fcf0 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Reg ){.    pPars
2fd00 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e  e->nRangeReg = n
2fd10 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
2fd20 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65  >iRangeReg = iRe
2fd30 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
2fd40 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61  Mark all tempora
2fd50 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20  ry registers as 
2fd60 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c  being unavailabl
2fd70 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a  e for reuse..*/.
2fd80 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
2fd90 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61  rTempRegCache(Pa
2fda0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
2fdb0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2fdc0 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
2fdd0 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d  nRangeReg = 0;.}
2fde0 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65  ../*.** Validate
2fdf0 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61   that no tempora
2fe00 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c  ry register fall
2fe10 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  s within the ran
2fe20 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e  ge of.** iFirst.
2fe30 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76  .iLast, inclusiv
2fe40 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2fe50 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72   is only call fr
2fe60 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  om within assert
2fe70 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ().** statements
2fe80 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2fe90 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
2fea0 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e  ite3NoTempsInRan
2feb0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2fec0 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e  , int iFirst, in
2fed0 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20  t iLast){.  int 
2fee0 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  i;.  if( pParse-
2fef0 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20  >nRangeReg>0.   
2ff00 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67  && pParse->iRang
2ff10 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61  eReg+pParse->nRa
2ff20 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73 74 0a  ngeReg > iFirst.
2ff30 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
2ff40 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61 73 74  angeReg <= iLast
2ff50 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  .  ){.     retur
2ff60 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
2ff70 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
2ff80 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  empReg; i++){.  
2ff90 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54    if( pParse->aT
2ffa0 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73  empReg[i]>=iFirs
2ffb0 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65  t && pParse->aTe
2ffc0 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20  mpReg[i]<=iLast 
2ffd0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2ffe0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
2fff0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
30000 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
30010 47 20 2a 2f 0a                                   G */.