/ Hex Artifact Content
Login

Artifact 82ccc704a2e5aa114f2a2c67610b87963add6d65336f352bb1782a2942356bcb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
0fd0: 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20  quence might be 
0fe0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20  determined by a 
0ff0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
1000: 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72  .** or by the pr
1010: 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75  esence of a colu
1020: 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  mn with a define
1030: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
1040: 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45  ence..** COLLATE
1050: 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20   operators take 
1060: 66 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65  first precedence
1070: 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73  .  Left operands
1080: 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65   take.** precede
1090: 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f  nce over right o
10a0: 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c  perands..*/.Coll
10b0: 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72  Seq *sqlite3Expr
10c0: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
10d0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
10e0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
10f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1100: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1110: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
1120: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
1130: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
1140: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
1150: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
1160: 50 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61  P_Generic ) brea
1170: 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  k;.    if( op==T
1180: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1190: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
11a0: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
11b0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
11c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
11d0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f  TK_COLLATE || (o
11e0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
11f0: 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c  & p->op2==TK_COL
1200: 4c 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70  LATE) ){.      p
1210: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
1220: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
1230: 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e   ENC(db), 0, p->
1240: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1260: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
1270: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
1280: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1290: 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45      || op==TK_RE
12a0: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
12b0: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26  _TRIGGER).     &
12c0: 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  & p->pTab!=0.   
12d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d   ){.      /* op=
12e0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
12f0: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
1300: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
1310: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
1320: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1330: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1340: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1350: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1360: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1370: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1380: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1390: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
13a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
13b0: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
13c0: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
13d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
13e0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
13f0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
1400: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1420: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
1430: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1440: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1450: 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66  Left && (p->pLef
1460: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1470: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1480: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
1490: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
14a0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
14b0: 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74  ext  = p->pRight
14c0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
14d0: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
14e0: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
14f0: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
1500: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
1510: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1520: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
1530: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
1540: 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c          /* p->fl
1550: 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c  ags holds EP_Col
1560: 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66  late and p->pLef
1570: 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f  t->flags does no
1580: 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20  t.  And.        
1590: 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ** p->x.pSelect 
15a0: 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70  cannot.  So if p
15b0: 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73  ->x.pLeft exists
15c0: 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61  , it must hold a
15d0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61  t.        ** lea
15e0: 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74  st one EP_Collat
15f0: 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c  e. Thus the foll
1600: 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53  owing two ALWAYS
1610: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
1620: 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26   p->x.pList!=0 &
1630: 26 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61  & ALWAYS(!ExprHa
1640: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1650: 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20  xIsSelect)) ){. 
1660: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
1670: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1680: 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78  0; ALWAYS(i<p->x
1690: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20  .pList->nExpr); 
16a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
16b0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
16c0: 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74  perty(p->x.pList
16d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  ->a[i].pExpr, EP
16e0: 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20  _Collate) ){.   
16f0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74             pNext
1700: 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61   = p->x.pList->a
1710: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
1720: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1750: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20    }.        p = 
1760: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1770: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1780: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1790: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
17a0: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
17b0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
17c0: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
17d0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
17e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
17f0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
1800: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1810: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
1820: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1830: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
1840: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
1850: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1860: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1870: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1880: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
1890: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
18a0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
18b0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
18c0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
18d0: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
18e0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
18f0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1900: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
1910: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
1920: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
1930: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
1940: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
1950: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
1960: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
1970: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
1980: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
1990: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
19a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19b0: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
19c0: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
19d0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
19e0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
19f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a00: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
1a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1a20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1a30: 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BLOB;.    }.  }
1a40: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1a50: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1a60: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
1a70: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
1a80: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
1a90: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
1aa0: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
1ab0: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
1ac0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1ad0: 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BLOB;.  }else{.
1ae0: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
1af0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
1b00: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
1b10: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
1b20: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
1b30: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1b40: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1b50: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1b60: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
1b70: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
1b80: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1b90: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
1ba0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1bb0: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
1bc0: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1bd0: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1be0: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1bf0: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1c00: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1c10: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1c20: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1c30: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1c40: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1c50: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1c60: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
1c70: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
1c80: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
1c90: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
1ca0: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
1cb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
1cc0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1cd0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70  ->op==TK_NE || p
1ce0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1cf0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1d00: 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65  _ISNOT );.  asse
1d10: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1d20: 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69   );.  aff = sqli
1d30: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1d40: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1d50: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
1d60: 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ht ){.    aff = 
1d70: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1d80: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52  finity(pExpr->pR
1d90: 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65  ight, aff);.  }e
1da0: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
1db0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1dc0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1dd0: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1de0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1df0: 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63  (pExpr->x.pSelec
1e00: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
1e10: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
1e20: 65 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20  else if( aff==0 
1e30: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c  ){.    aff = SQL
1e40: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
1e50: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
1e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1e70: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65  s a comparison e
1e80: 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27  xpression, eg. '
1e90: 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29  =', '<', IN(...)
1ea0: 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66   etc..** idx_aff
1eb0: 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66  inity is the aff
1ec0: 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65  inity of an inde
1ed0: 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75  xed column. Retu
1ee0: 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68  rn true.** if th
1ef0: 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66  e index with aff
1f00: 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69  inity idx_affini
1f10: 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  ty may be used t
1f20: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74  o implement.** t
1f30: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  he comparison in
1f40: 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pExpr..*/.int s
1f50: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
1f60: 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70  ityOk(Expr *pExp
1f70: 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69  r, char idx_affi
1f80: 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66  nity){.  char af
1f90: 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  f = comparisonAf
1fa0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
1fb0: 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a   switch( aff ){.
1fc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1fd0: 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20  AFF_BLOB:.      
1fe0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61  return 1;.    ca
1ff0: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
2000: 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  XT:.      return
2010: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
2020: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
2030: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
2040: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2050: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
2060: 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ty(idx_affinity)
2070: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2080: 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c  eturn the P5 val
2090: 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ue that should b
20a0: 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e  e used for a bin
20b0: 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  ary comparison.*
20c0: 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c  * opcode (OP_Eq,
20d0: 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65   OP_Ge etc.) use
20e0: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78  d to compare pEx
20f0: 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a  pr1 and pExpr2..
2100: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e  */.static u8 bin
2110: 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70  aryCompareP5(Exp
2120: 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20  r *pExpr1, Expr 
2130: 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d  *pExpr2, int jum
2140: 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61  pIfNull){.  u8 a
2150: 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74  ff = (char)sqlit
2160: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2170: 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20  Expr2);.  aff = 
2180: 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61  (u8)sqlite3Compa
2190: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
21a0: 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75  1, aff) | (u8)ju
21b0: 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75  mpIfNull;.  retu
21c0: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
21d0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
21e0: 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69  r to the collati
21f0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  on sequence that
2200: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
2210: 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63  by.** a binary c
2220: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2230: 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65  or comparing pLe
2240: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
2250: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74  *.** If the left
2260: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
2270: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
2280: 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20   sequence type, 
2290: 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73  then it is.** us
22a0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  ed. Otherwise th
22b0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
22c0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67  ence for the rig
22d0: 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ht hand expressi
22e0: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f  on.** is used, o
22f0: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42  r the default (B
2300: 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65  INARY) if neithe
2310: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  r expression has
2320: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20   a collating.** 
2330: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  type..**.** Argu
2340: 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74  ment pRight (but
2350: 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20   not pLeft) may 
2360: 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  be a null pointe
2370: 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
2380: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f  .** it is not co
2390: 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c  nsidered..*/.Col
23a0: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e  lSeq *sqlite3Bin
23b0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
23c0: 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  q(.  Parse *pPar
23d0: 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65  se, .  Expr *pLe
23e0: 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69  ft, .  Expr *pRi
23f0: 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ght.){.  CollSeq
2400: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72   *pColl;.  asser
2410: 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66  t( pLeft );.  if
2420: 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ( pLeft->flags &
2430: 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
2440: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2450: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2460: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
2470: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
2480: 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61   && (pRight->fla
2490: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
24a0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  !=0 ){.    pColl
24b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24c0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52  llSeq(pParse, pR
24d0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
24e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
24f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2500: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
2510: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
2520: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
2530: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2540: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
2550: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2560: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
2570: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
2580: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
2590: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
25a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
25b0: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
25c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
25d0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
25e0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
25f0: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
2600: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
2610: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
2620: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
2630: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
2640: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
2650: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
2660: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
2670: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
2680: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20  e */.  int in1, 
2690: 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69  int in2, /* Regi
26a0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65  ster holding ope
26b0: 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rands */.  int d
26c0: 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
26d0: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75  Jump here if tru
26e0: 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  e.  */.  int jum
26f0: 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66  pIfNull    /* If
2700: 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65   true, jump if e
2710: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
2720: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
2730: 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72  t p5;.  int addr
2740: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b  ;.  CollSeq *p4;
2750: 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33  ..  p4 = sqlite3
2760: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
2770: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2780: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70  ft, pRight);.  p
2790: 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  5 = binaryCompar
27a0: 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68  eP5(pLeft, pRigh
27b0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
27c0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
27d0: 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73  VdbeAddOp4(pPars
27e0: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
27f0: 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31  , in2, dest, in1
2800: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
2820: 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53  id*)p4, P4_COLLS
2830: 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EQ);.  sqlite3Vd
2840: 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73  beChangeP5(pPars
2850: 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35  e->pVdbe, (u8)p5
2860: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
2870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2880: 6e 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73  n true if expres
2890: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20  sion pExpr is a 
28a0: 76 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65  vector, or false
28b0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
28c0: 2a 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65  * A vector is de
28d0: 66 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70  fined as any exp
28e0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73  ression that res
28f0: 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d  ults in two or m
2900: 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f  ore.** columns o
2910: 66 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79  f result.  Every
2920: 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20   TK_VECTOR node 
2930: 69 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63  is an vector bec
2940: 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73  ause the.** pars
2950: 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65  er will not gene
2960: 72 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52  rate a TK_VECTOR
2970: 20 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e   with fewer than
2980: 20 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a   two entries..**
2990: 20 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54   But a TK_SELECT
29a0: 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
29b0: 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73   a vector or a s
29c0: 63 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c  calar. It is onl
29d0: 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20  y.** considered 
29e0: 61 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68  a vector if it h
29f0: 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72  as two or more r
2a00: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  esult columns..*
2a10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2a20: 72 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a  rIsVector(Expr *
2a30: 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e  pExpr){.  return
2a40: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
2a50: 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b  orSize(pExpr)>1;
2a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
2a70: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
2a80: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
2a90: 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79  rgument is of ty
2aa0: 70 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a  pe TK_VECTOR .**
2ab0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
2ac0: 65 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  er of expression
2ad0: 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e  s in the vector.
2ae0: 20 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72   Or, if the expr
2af0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73  ession.** is a s
2b00: 75 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72  ub-select, retur
2b10: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2b20: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
2b30: 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a  ub-select. For.*
2b40: 2a 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65  * any other type
2b50: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   of expression, 
2b60: 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74  return 1..*/.int
2b70: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
2b80: 6f 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78  orSize(Expr *pEx
2b90: 70 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70  pr){.  u8 op = p
2ba0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
2bb0: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
2bc0: 29 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  ) op = pExpr->op
2bd0: 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  2;.  if( op==TK_
2be0: 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65  VECTOR ){.    re
2bf0: 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c  turn pExpr->x.pL
2c00: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65  ist->nExpr;.  }e
2c10: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53  lse if( op==TK_S
2c20: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74  ELECT ){.    ret
2c30: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  urn pExpr->x.pSe
2c40: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
2c50: 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  xpr;.  }else{.  
2c60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2c80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
2c90: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  ubexpression of 
2ca0: 70 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20  pVector that is 
2cb0: 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75  the i-th.** colu
2cc0: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
2cd0: 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74   (numbered start
2ce0: 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68  ing with 0).  Th
2cf0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
2d00: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69   ensure that i i
2d10: 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a  s within range..
2d20: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
2d30: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61   is really a sca
2d40: 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72  lar (and "scalar
2d50: 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20  " here includes 
2d60: 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68  subqueries.** th
2d70: 61 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  at return a sing
2d80: 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e  le column!) then
2d90: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20   return pVector 
2da0: 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  unmodified..**.*
2db0: 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e  * pVector retain
2dc0: 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  s ownership of t
2dd0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65  he returned sube
2de0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2df0: 20 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69   If the vector i
2e00: 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  s a (SELECT ...)
2e10: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
2e20: 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73  sion returned is
2e30: 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70  .** just the exp
2e40: 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20  ression for the 
2e50: 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  i-th term of the
2e60: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
2e70: 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72   may.** not be r
2e80: 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74  eady for evaluat
2e90: 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ion because the 
2ea0: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73  table cursor has
2eb0: 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e   not yet.** been
2ec0: 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a   positioned..*/.
2ed0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63  Expr *sqlite3Vec
2ee0: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
2ef0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69  Expr *pVector, i
2f00: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
2f10: 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65   i<sqlite3ExprVe
2f20: 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72  ctorSize(pVector
2f30: 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ) );.  if( sqlit
2f40: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
2f50: 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61  Vector) ){.    a
2f60: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
2f70: 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f  op2==0 || pVecto
2f80: 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
2f90: 45 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ER );.    if( pV
2fa0: 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  ector->op==TK_SE
2fb0: 4c 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d  LECT || pVector-
2fc0: 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  >op2==TK_SELECT 
2fd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2fe0: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65  pVector->x.pSele
2ff0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
3000: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73  .pExpr;.    }els
3010: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
3020: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
3030: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
3040: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3050: 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   pVector;.}../*.
3060: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
3070: 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72  eturn a new Expr
3080: 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68   object which wh
3090: 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20  en passed to.** 
30a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
30b0: 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  ) will generate 
30c0: 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f  all necessary co
30d0: 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a  de to compute.**
30e0: 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63   the iField-th c
30f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
3100: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70  tor expression p
3110: 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74  Vector..**.** It
3120: 20 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74   is ok for pVect
3130: 6f 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  or to be a scala
3140: 72 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46  r (as long as iF
3150: 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49  ield==0).  .** I
3160: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69  n that case, thi
3170: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
3180: 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
3190: 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Dup()..**.** The
31a0: 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65   caller owns the
31b0: 20 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f   returned Expr o
31c0: 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73  bject and is res
31d0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  ponsible for.** 
31e0: 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
31f0: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
3200: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
3210: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   freed..**.** Th
3220: 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73  e caller retains
3230: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56   ownership of pV
3240: 65 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74  ector.  If pVect
3250: 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43  or is a TK_SELEC
3260: 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  T,.** then the r
3270: 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77  eturned object w
3280: 69 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56  ill reference pV
3290: 65 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65  ector and so pVe
32a0: 63 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e  ctor must remain
32b0: 0a 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68  .** valid for th
32c0: 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65  e life of the re
32d0: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20  turned object.  
32e0: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
32f0: 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20  TK_VECTOR.** or 
3300: 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
3310: 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e  ion, then it can
3320: 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73   be deleted as s
3330: 6f 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74  oon as this rout
3340: 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a  ine.** returns..
3350: 2a 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f  **.** A trick to
3360: 20 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45   cause a TK_SELE
3370: 43 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  CT pVector to be
3380: 20 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65   deleted togethe
3390: 72 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65  r with.** the re
33a0: 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65  turned Expr obje
33b0: 63 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20  ct is to attach 
33c0: 74 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74  the pVector to t
33d0: 68 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a  he pRight field.
33e0: 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ** of the return
33f0: 65 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  ed TK_SELECT_COL
3400: 55 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e  UMN Expr object.
3410: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
3420: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
3430: 65 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  eld(.  Parse *pP
3440: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
3450: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
3460: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
3470: 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r,       /* The 
3480: 76 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66  vector.  List of
3490: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
34a0: 61 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a  a sub-SELECT */.
34b0: 20 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20    int iField    
34c0: 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
34d0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65  column of the ve
34e0: 63 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a  ctor to return *
34f0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65  /.){.  Expr *pRe
3500: 74 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72  t;.  if( pVector
3510: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3520: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3530: 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20  Vector->flags & 
3540: 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a  EP_xIsSelect );.
3550: 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45      /* The TK_SE
3560: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
3570: 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   node:.    **.  
3580: 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20    ** pLeft:     
3590: 20 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f        pVector co
35a0: 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45  ntaining TK_SELE
35b0: 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64  CT.  Not deleted
35c0: 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a  ..    ** pRight:
35d0: 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73            not us
35e0: 65 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69  ed.  But recursi
35f0: 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20  vely deleted..  
3600: 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20    ** iColumn:   
3610: 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61        Index of a
3620: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74   column in pVect
3630: 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65  or.    ** iTable
3640: 3a 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20  :          0 or 
3650: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
3660: 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53  lumns on the LHS
3670: 20 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e   of an assignmen
3680: 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e  t.    ** pLeft->
3690: 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20  iTable:   First 
36a0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
36b0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
36c0: 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20  result, or 0.   
36d0: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
36e0: 20 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75       if the resu
36f0: 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f  lt is not yet co
3700: 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  mputed..    **. 
3710: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70     ** sqlite3Exp
3720: 72 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66  rDelete() specif
3730: 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65  ically skips the
3740: 20 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74   recursive delet
3750: 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66  e of.    ** pLef
3760: 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43  t on TK_SELECT_C
3770: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75  OLUMN nodes.  Bu
3780: 74 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c  t pRight is foll
3790: 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72  owed, so pVector
37a0: 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61  .    ** can be a
37b0: 74 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68  ttached to pRigh
37c0: 74 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20  t to cause this 
37d0: 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e  node to take own
37e0: 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a  ership of.    **
37f0: 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63   pVector.  Typic
3800: 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20  ally there will 
3810: 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53  be multiple TK_S
3820: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  ELECT_COLUMN nod
3830: 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  es.    ** with t
3840: 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f  he same pLeft po
3850: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65  inter to the pVe
3860: 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f  ctor, but only o
3870: 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ne of them.    *
3880: 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70  * will own the p
3890: 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  Vector..    */. 
38a0: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
38b0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
38c0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c  K_SELECT_COLUMN,
38d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
38e0: 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52  pRet ){.      pR
38f0: 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46  et->iColumn = iF
3900: 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74  ield;.      pRet
3910: 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f  ->pLeft = pVecto
3920: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
3930: 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20  ert( pRet==0 || 
3940: 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  pRet->iTable==0 
3950: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3960: 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d  if( pVector->op=
3970: 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65  =TK_VECTOR ) pVe
3980: 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e  ctor = pVector->
3990: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  x.pList->a[iFiel
39a0: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52  d].pExpr;.    pR
39b0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
39c0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
39d0: 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d  pVector, 0);.  }
39e0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
39f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72  }../*.** If expr
3a00: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
3a10: 6f 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43  of type TK_SELEC
3a20: 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  T, generate code
3a30: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
3a40: 69 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72  it. Return the r
3a50: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
3a60: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
3a70: 74 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68  tored (or, if th
3a80: 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
3a90: 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68   returns more th
3aa0: 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74  an one column, t
3ab0: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
3ac0: 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73  rray.** of regis
3ad0: 74 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68  ters in which th
3ae0: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
3af0: 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ed)..**.** If pE
3b00: 78 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f  xpr is not a TK_
3b10: 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f  SELECT expressio
3b20: 6e 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  n, return 0..*/.
3b30: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
3b40: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72  odeSubselect(Par
3b50: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
3b60: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
3b70: 72 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  reg = 0;.#ifndef
3b80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
3b90: 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70  QUERY.  if( pExp
3ba0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
3bb0: 20 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71   ){.    reg = sq
3bc0: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
3bd0: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
3be0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
3bf0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67  dif.  return reg
3c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
3c10: 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e  ent pVector poin
3c20: 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65  ts to a vector e
3c30: 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68  xpression - eith
3c40: 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  er a TK_VECTOR.*
3c50: 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74  * or TK_SELECT t
3c60: 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  hat returns more
3c70: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
3c80: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
3c90: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72  returns.** the r
3ca0: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f  egister number o
3cb0: 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  f a register tha
3cc0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
3cd0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  alue of.** eleme
3ce0: 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65  nt iField of the
3cf0: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   vector..**.** I
3d00: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
3d10: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
3d20: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  ion, then code f
3d30: 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20  or it must have 
3d40: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3d50: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
3d60: 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62   the exprCodeSub
3d70: 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  select() routine
3d80: 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
3d90: 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53  e parameter regS
3da0: 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  elect should be 
3db0: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
3dc0: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
3dd0: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
3de0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
3df0: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
3e00: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
3e10: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
3e20: 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64  VECTOR, then cod
3e30: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
3e40: 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20  ted field.** is 
3e50: 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68  generated. In th
3e60: 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72  is case (*pRegFr
3e70: 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  ee) may be set t
3e80: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
3e90: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  ** a temporary r
3ea0: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72  egister to be fr
3eb0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
3ec0: 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
3ed0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
3ee0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70   returning, outp
3ef0: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
3f00: 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f  pExpr) is set to
3f10: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
3f20: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72   Expr object cor
3f30: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c  responding to el
3f40: 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74  ement iElem of t
3f50: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74  he vector..*/.st
3f60: 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63  atic int exprVec
3f70: 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50  torRegister(.  P
3f80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3fa0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
3fb0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
3fc0: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
3fd0: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74       /* Vector t
3fe0: 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e  o extract elemen
3ff0: 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
4000: 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20  iField,         
4010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4020: 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20  ield to extract 
4030: 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a  from pVector */.
4040: 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c    int regSelect,
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
4070: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
4080: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
4090: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
40a0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
40b0: 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74  pression element
40c0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46   */.  int *pRegF
40d0: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
40e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65        /* OUT: Te
40f0: 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
4100: 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f  ree */.){.  u8 o
4110: 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b  p = pVector->op;
4120: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
4130: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d  K_VECTOR || op==
4140: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
4150: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
4160: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
4170: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70  ISTER ){.    *pp
4180: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65  Expr = sqlite3Ve
4190: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
41a0: 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64  (pVector, iField
41b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
41c0: 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46  ector->iTable+iF
41d0: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ield;.  }.  if( 
41e0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
41f0: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
4200: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
4210: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69  t->pEList->a[iFi
4220: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
4230: 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63   return regSelec
4240: 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  t+iField;.  }.  
4250: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
4260: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
4270: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72  ield].pExpr;.  r
4280: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
4290: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
42a0: 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46  , *ppExpr, pRegF
42b0: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ree);.}../*.** E
42c0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
42d0: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
42e0: 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74  between two vect
42f0: 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75  or values. Compu
4300: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
4310: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
4320: 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c  on (1, 0, or NUL
4330: 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  L) and write tha
4340: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f  t.** result into
4350: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
4360: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4370: 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68   must satisfy th
4380: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63  e following prec
4390: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
43a0: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
43b0: 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70  ==TK_IS:      op
43c0: 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d  ==TK_EQ and p5==
43d0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
43e0: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
43f0: 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70  ==TK_ISNOT:   op
4400: 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d  ==TK_NE and p5==
4410: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4420: 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20      otherwise:  
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
4440: 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  ==pExpr->op and 
4450: 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20  p5==0.*/.static 
4460: 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43  void codeVectorC
4470: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
4480: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
4490: 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f  /* Code generato
44a0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
44b0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
44c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
44d0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
44e0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4500: 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
4510: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
4520: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
4530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
4540: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
4550: 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  r */.  u8 p5    
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4570: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72  SQLITE_NULLEQ or
4580: 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64   zero */.){.  Vd
4590: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
45a0: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
45b0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
45c0: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
45d0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
45e0: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74  ght;.  int nLeft
45f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
4600: 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
4610: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4620: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69  regLeft = 0;.  i
4630: 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b  nt regRight = 0;
4640: 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a  .  u8 opx = op;.
4650: 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d    int addrDone =
4660: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4670: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28  Label(v);..  if(
4680: 20 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45   nLeft!=sqlite3E
4690: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52  xprVectorSize(pR
46a0: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
46b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
46c0: 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
46d0: 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72  misused");.    r
46e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
46f0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
4700: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
4710: 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20  op==TK_NE .     
4720: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
4730: 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IS || pExpr->
4740: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20  op==TK_ISNOT .  
4750: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
4760: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70  p==TK_LT || pExp
4770: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20  r->op==TK_GT .  
4780: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
4790: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70  p==TK_LE || pExp
47a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20  r->op==TK_GE .  
47b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
47c0: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70  pr->op==op || (p
47d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
47e0: 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20  && op==TK_EQ).  
47f0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45            || (pE
4800: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4810: 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20  T && op==TK_NE) 
4820: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d  );.  assert( p5=
4830: 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21  =0 || pExpr->op!
4840: 3d 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =op );.  assert(
4850: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
4860: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
4870: 3d 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20  =op );..  p5 |= 
4880: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a  SQLITE_STOREP2;.
4890: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45    if( opx==TK_LE
48a0: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a   ) opx = TK_LT;.
48b0: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45    if( opx==TK_GE
48c0: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a   ) opx = TK_GT;.
48d0: 0a 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70  .  regLeft = exp
48e0: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
48f0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
4900: 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72   regRight = expr
4910: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4920: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a  arse, pRight);..
4930: 20 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c    for(i=0; 1 /*L
4940: 6f 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72  oop exits by "br
4950: 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20  eak"*/; i++){.  
4960: 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
4970: 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30   0, regFree2 = 0
4980: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20  ;.    Expr *pL, 
4990: 2a 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31  *pR; .    int r1
49a0: 2c 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74  , r2;.    assert
49b0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66  ( i>=0 && i<nLef
49c0: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30  t );.    if( i>0
49d0: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61   ) sqlite3ExprCa
49e0: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
49f0: 0a 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65  .    r1 = exprVe
4a00: 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61  ctorRegister(pPa
4a10: 72 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72  rse, pLeft, i, r
4a20: 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65  egLeft, &pL, &re
4a30: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20  gFree1);.    r2 
4a40: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
4a50: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69  ster(pParse, pRi
4a60: 67 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74  ght, i, regRight
4a70: 2c 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32  , &pR, &regFree2
4a80: 29 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  );.    codeCompa
4a90: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70  re(pParse, pL, p
4aa0: 52 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20  R, opx, r1, r2, 
4ab0: 64 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74  dest, p5);.    t
4ac0: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
4ad0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4ae0: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
4af0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
4b00: 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
4b10: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4b20: 50 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63  P_Le);.    testc
4b30: 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
4b40: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4b50: 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
4b60: 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
4b70: 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
4b80: 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
4b90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4ba0: 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
4bb0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4bc0: 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73  =OP_Eq);.    tes
4bd0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
4be0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4bf0: 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
4c00: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4c10: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4c20: 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20   regFree1);.    
4c30: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4c40: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
4c50: 67 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28  gFree2);.    if(
4c60: 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78   i>0 ) sqlite3Ex
4c70: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
4c80: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  e);.    if( i==n
4c90: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
4ca0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4cb0: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20   if( opx==TK_EQ 
4cc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4cd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4ce0: 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64  _IfNot, dest, ad
4cf0: 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76  drDone); VdbeCov
4d00: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
4d10: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
4d20: 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  PNULL;.    }else
4d30: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20   if( opx==TK_NE 
4d40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4d50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4d60: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
4d70: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
4d80: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
4d90: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
4da0: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
4db0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
4dc0: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LT || op==TK
4dd0: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45  _GT || op==TK_LE
4de0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b   || op==TK_GE );
4df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
4e10: 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64  lseNotEq, 0, add
4e20: 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  rDone);.      Vd
4e30: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
4e40: 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
4e50: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4e60: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  (v, op==TK_GT);.
4e70: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4e80: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
4e90: 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
4ea0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
4eb0: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66  TK_GE);.      if
4ec0: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
4ed0: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20  px = op;.    }. 
4ee0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4ef0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
4f00: 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69  addrDone);.}..#i
4f10: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
4f20: 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20  R_DEPTH>0./*.** 
4f30: 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d  Check that argum
4f40: 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c  ent nHeight is l
4f50: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
4f60: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
4f70: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
4f80: 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66  epth allowed. If
4f90: 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76   it is not, leav
4fa0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
4fb0: 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e  ge in.** pParse.
4fc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
4fd0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50  xprCheckHeight(P
4fe0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
4ff0: 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e  t nHeight){.  in
5000: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5010: 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74  ;.  int mxHeight
5020: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
5030: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5040: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
5050: 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78    if( nHeight>mx
5060: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  Height ){.    sq
5070: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5080: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45  arse, .       "E
5090: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
50a0: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
50b0: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
50c0: 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b   mxHeight.    );
50d0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
50e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
50f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
5100: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
5110: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
5120: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
5130: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
5140: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
5150: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
5160: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
5170: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5180: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
5190: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
51a0: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
51b0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
51c0: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
51d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
51e0: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
51f0: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
5200: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
5210: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
5220: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
5230: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
5240: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
5250: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
5260: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
5270: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
5280: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
5290: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
52a0: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
52b0: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
52c0: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
52d0: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
52e0: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
52f0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5300: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5310: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
5320: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5330: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5340: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
5350: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
5360: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
5370: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
5380: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
5390: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
53a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
53b0: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
53c0: 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  ct *p, int *pnHe
53d0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
53e0: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  {.    heightOfEx
53f0: 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e  pr(p->pWhere, pn
5400: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5410: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61  ghtOfExpr(p->pHa
5420: 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b  ving, pnHeight);
5430: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5440: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48  r(p->pLimit, pnH
5450: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5460: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66  htOfExpr(p->pOff
5470: 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  set, pnHeight);.
5480: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5490: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
54a0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
54b0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
54c0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
54d0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
54e0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
54f0: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
5500: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5510: 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f  fSelect(p->pPrio
5520: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
5530: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
5540: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
5550: 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20  variable in the 
5560: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
5570: 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d   as an .** argum
5580: 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69  ent. An expressi
5590: 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64  on with no child
55a0: 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20  ren, Expr.pList 
55b0: 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c  or .** Expr.pSel
55c0: 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61  ect member has a
55d0: 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e   height of 1. An
55e0: 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  y other expressi
55f0: 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67  on.** has a heig
5600: 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ht equal to the 
5610: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
5620: 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20  f any other .** 
5630: 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20  referenced Expr 
5640: 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  plus one..**.** 
5650: 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 45  Also propagate E
5660: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5670: 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e 78  s up from Expr.x
5680: 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e 66  .pList to Expr.f
5690: 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72  lags,.** if appr
56a0: 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
56b0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
56c0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
56d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
56e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
56f0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
5700: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
5710: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
5720: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
5730: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
5740: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
5750: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
5760: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
5770: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
5780: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
5790: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
57a0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
57b0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48  (p->x.pList, &nH
57c0: 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66  eight);.    p->f
57d0: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
57e0: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
57f0: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5800: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70  .pList);.  }.  p
5810: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
5820: 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ght + 1;.}../*.*
5830: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
5840: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
5850: 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53 65  using the exprSe
5860: 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74 69  tHeight() functi
5870: 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65  on. If.** the he
5880: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
5890: 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  than the maximum
58a0: 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73   allowed express
58b0: 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65  ion depth,.** le
58c0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
58d0: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  pParse..**.** Al
58e0: 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c 6c  so propagate all
58f0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c   EP_Propagate fl
5900: 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ags from the Exp
5910: 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a  r.x.pList into.*
5920: 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a  * Expr.flags. .*
5930: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5940: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
5950: 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ags(Parse *pPars
5960: 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  e, Expr *p){.  i
5970: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
5980: 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72  ) return;.  expr
5990: 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20  SetHeight(p);.  
59a0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
59b0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
59c0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f  ->nHeight);.}../
59d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
59e0: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
59f0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
5a00: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
5a10: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
5a20: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
5a30: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
5a40: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5a50: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
5a60: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
5a70: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
5a80: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
5a90: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
5aa0: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
5ab0: 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f  ;.}.#else /* ABO
5ac0: 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f  VE:  Height enfo
5ad0: 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e  rcement enabled.
5ae0: 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20    BELOW: Height 
5af0: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20  enforcement off 
5b00: 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61  */./*.** Propaga
5b10: 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67  te all EP_Propag
5b20: 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74  ate flags from t
5b30: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
5b40: 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61  into.** Expr.fla
5b50: 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gs. .*/.void sql
5b60: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
5b70: 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20  tAndFlags(Parse 
5b80: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
5b90: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
5ba0: 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78 70  >x.pList && !Exp
5bb0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5bc0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
5bd0: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
5be0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
5bf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
5c00: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
5c10: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
5c20: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
5c30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5c40: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
5c50: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
5c60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
5c70: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
5c80: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
5c90: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
5ca0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
5cb0: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
5cc0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
5cd0: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
5ce0: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
5cf0: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
5d00: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
5d10: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
5d20: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5d30: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
5d40: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
5d50: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
5d60: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
5d70: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
5d80: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
5d90: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
5da0: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
5db0: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
5dc0: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
5dd0: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
5de0: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
5df0: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
5e00: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ing is performed
5e10: 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a  .  The deQuote.*
5e20: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  * parameter is i
5e30: 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e  gnored if pToken
5e40: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
5e50: 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f  he token does no
5e60: 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62  t.** appear to b
5e70: 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68  e quoted.  If th
5e80: 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66  e quotes were of
5e90: 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20   the form "..." 
5ea0: 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a  (double-quotes).
5eb0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44  ** then the EP_D
5ec0: 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73  blQuoted flag is
5ed0: 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72   set on the expr
5ee0: 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a  ession node..**.
5ef0: 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  ** Special case:
5f00: 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45    If op==TK_INTE
5f10: 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70  GER and pToken p
5f20: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
5f30: 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  g that.** can be
5f40: 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f   translated into
5f50: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
5f60: 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  r, then the toke
5f70: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72  n is not.** stor
5f80: 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20  ed in u.zToken. 
5f90: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e   Instead, the in
5fa0: 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73 20  teger values is 
5fb0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
5fc0: 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65  u.iValue and the
5fd0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
5fe0: 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78  g is set.  No ex
5ff0: 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69  tra storage.** i
6000: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  s allocated to h
6010: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  old the integer 
6020: 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65 71  text and the deq
6030: 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e  uote flag is ign
6040: 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ored..*/.Expr *s
6050: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
6060: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
6070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
6080: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
6090: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20  DbMallocRawNN() 
60a0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60c0: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
60d0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  e */.  const Tok
60e0: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f  en *pToken,    /
60f0: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
6100: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
6110: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
6120: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
6130: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
6140: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
6150: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  New;.  int nExtr
6160: 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  a = 0;.  int iVa
6170: 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  lue = 0;..  asse
6180: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
6190: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
61a0: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45   if( op!=TK_INTE
61b0: 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a  GER || pToken->z
61c0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
61d0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
61e0: 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61  (pToken->z, &iVa
61f0: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lue)==0 ){.     
6200: 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e   nExtra = pToken
6210: 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  ->n+1;.      ass
6220: 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29  ert( iValue>=0 )
6230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
6240: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
6250: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
6260: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
6270: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
6280: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  {.    memset(pNe
6290: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  w, 0, sizeof(Exp
62a0: 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  r));.    pNew->o
62b0: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
62c0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
62d0: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  .    if( pToken 
62e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  ){.      if( nEx
62f0: 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tra==0 ){.      
6300: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6310: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
6320: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
6330: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
6340: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6350: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6360: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
6370: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6380: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6390: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
63a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
63b0: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
63c0: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
63d0: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
63e0: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
63f0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6400: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
6410: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
6420: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
6430: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
6440: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
6450: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
6460: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
6470: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6480: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6490: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
64a0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
64b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
64c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
64d0: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
64e0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
64f0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
6500: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
6510: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
6520: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
6530: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
6540: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
6550: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
6560: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
6570: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6580: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6590: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
65a0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
65c0: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
65d0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
65e0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
65f0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
6600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
6610: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
6620: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6630: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
6640: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
6650: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6660: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
6670: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6680: 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f    x.n = zToken ?
6690: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
66a0: 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20  (zToken) : 0;.  
66b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
66c0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20  prAlloc(db, op, 
66d0: 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &x, 0);.}../*.**
66e0: 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73   Attach subtrees
66f0: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
6700: 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f  t to the Expr no
6710: 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  de pRoot..**.** 
6720: 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74  If pRoot==NULL t
6730: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61  hat means that a
6740: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6750: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
6760: 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61  urred..** In tha
6770: 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74  t case, delete t
6780: 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66  he subtrees pLef
6790: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f  t and pRight..*/
67a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
67b0: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
67c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
67d0: 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20    Expr *pRoot,. 
67e0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20   Expr *pLeft,.  
67f0: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
6800: 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29    if( pRoot==0 )
6810: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
6820: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6830: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6840: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
6850: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
6860: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
6870: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
6880: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29      if( pRight )
6890: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
68a0: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a  Right = pRight;.
68b0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
68c0: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
68d0: 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61  te & pRight->fla
68e0: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  gs;.    }.    if
68f0: 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ( pLeft ){.     
6900: 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20   pRoot->pLeft = 
6910: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f  pLeft;.      pRo
6920: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
6930: 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66  Propagate & pLef
6940: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
6950: 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68      exprSetHeigh
6960: 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a  t(pRoot);.  }.}.
6970: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
6980: 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69  an Expr node whi
6990: 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79  ch joins as many
69a0: 20 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73   as two subtrees
69b0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62  ..**.** One or b
69c0: 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72  oth of the subtr
69d0: 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ees can be NULL.
69e0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
69f0: 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a  er to the new.**
6a00: 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c   Expr node.  Or,
6a10: 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   if an OOM error
6a20: 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61   occurs, set pPa
6a30: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
6a40: 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74  ailed,.** free t
6a50: 68 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20  he subtrees and 
6a60: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6a70: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78  Expr *sqlite3PEx
6a80: 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
6a90: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
6aa0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
6ab0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ad0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6ae0: 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  de */.  Expr *pL
6af0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
6b00: 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20  /* Left operand 
6b10: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
6b20: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
6b30: 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  Right operand */
6b40: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  .){.  Expr *p;. 
6b50: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20   if( op==TK_AND 
6b60: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
6b70: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
6b80: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
6b90: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
6ba0: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
6bb0: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
6bc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
6bd0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
6be0: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
6bf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
6c00: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6c10: 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  wNN(pParse->db, 
6c20: 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
6c30: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
6c40: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
6c50: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
6c60: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f 70 20 26      p->op = op &
6c70: 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a 20 20 20   TKFLG_MASK;.   
6c80: 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b     p->iAgg = -1;
6c90: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6ca0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
6cb0: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
6cc0: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
6cd0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
6ce0: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
6cf0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
6d00: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
6d10: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
6d20: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   p;.}../*.** Add
6d30: 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20   pSelect to the 
6d40: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66  Expr.x.pSelect f
6d50: 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45  ield.  Or, if pE
6d60: 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65  xpr is NULL (due
6d70: 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20  .** do a memory 
6d80: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
6d90: 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20  re) then delete 
6da0: 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65  the pSelect obje
6db0: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
6dc0: 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
6dd0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
6de0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65   Expr *pExpr, Se
6df0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
6e00: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
6e10: 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c     pExpr->x.pSel
6e20: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ect = pSelect;. 
6e30: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
6e40: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
6e50: 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65  Select|EP_Subque
6e60: 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
6e70: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
6e80: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 45  Flags(pParse, pE
6e90: 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  xpr);.  }else{. 
6ea0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
6eb0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6ec0: 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  led );.    sqlit
6ed0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
6ee0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65  Parse->db, pSele
6ef0: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ct);.  }.}.../*.
6f00: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
6f10: 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  sion is always e
6f20: 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41  ither TRUE or FA
6f30: 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c  LSE (respectivel
6f40: 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  y),.** then retu
6f50: 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61  rn 1.  If one ca
6f60: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74  nnot determine t
6f70: 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f  he truth value o
6f80: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
6f90: 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ion at compile-t
6fa0: 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ime return 0..**
6fb0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f  .** This is an o
6fc0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
6fd0: 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e   is OK to return
6fe0: 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a   0 here even if.
6ff0: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
7000: 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61  n really is alwa
7010: 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73  ys false or fals
7020: 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74  e (a false negat
7030: 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20  ive)..** But it 
7040: 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75  is a bug to retu
7050: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
7060: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76  ession might hav
7070: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62  e different.** b
7080: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e  oolean values in
7090: 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75   different circu
70a0: 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73  mstances (a fals
70b0: 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a  e positive.).**.
70c0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
70d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
70e0: 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74  s part of condit
70f0: 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c  ional for a.** L
7100: 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77  EFT JOIN, then w
7110: 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
7120: 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ne at compile-ti
7130: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
7140: 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20  t.** is it true 
7150: 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77  or false, so alw
7160: 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ays return 0..*/
7170: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
7180: 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20  AlwaysTrue(Expr 
7190: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
71a0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
71b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
71c0: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
71d0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
71e0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
71f0: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
7200: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30  0;.  return v!=0
7210: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  ;.}.static int e
7220: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45  xprAlwaysFalse(E
7230: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
7240: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
7250: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
7260: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
7270: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
7280: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
7290: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
72a0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
72b0: 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  v==0;.}../*.** J
72c0: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
72d0: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
72e0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
72f0: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
7300: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
7310: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
7320: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
7330: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
7340: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
7350: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
7360: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
7370: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
7380: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
7390: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
73a0: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
73b0: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
73c0: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
73d0: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
73e0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
73f0: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
7400: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
7410: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
7420: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
7430: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
7440: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
7450: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
7460: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
7470: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70  .  }else if( exp
7480: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
7490: 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79  ft) || exprAlway
74a0: 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29  sFalse(pRight) )
74b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
74c0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
74d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
74e0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
74f0: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
7500: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
7510: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
7520: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
7530: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
7540: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
7550: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
7560: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41  prAlloc(db, TK_A
7570: 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ND, 0, 0);.    s
7580: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
7590: 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65  Subtrees(db, pNe
75a0: 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  w, pLeft, pRight
75b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e  );.    return pN
75c0: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
75d0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
75e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
75f0: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
7600: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
7610: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
7620: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
7630: 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
7640: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
7650: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
7660: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
7670: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
7680: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7690: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
76a0: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
76b0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
76c0: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
76d0: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
76e0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
76f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
7700: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
7710: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
7720: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
7730: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
7740: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7750: 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  .  pNew->x.pList
7760: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65   = pList;.  asse
7770: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
7780: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
7790: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
77a0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
77b0: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
77c0: 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  e, pNew);.  retu
77d0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
77e0: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
77f0: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
7800: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
7810: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
7820: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
7830: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
7840: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
7850: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
7860: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
7870: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
7880: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7890: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
78a0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
78b0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
78c0: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
78d0: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
78e0: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
78f0: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
7900: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20   is not too big 
7910: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
7920: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
7930: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
7940: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
7950: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
7960: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
7970: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7980: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c  the form ":aaa",
7990: 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61   "@aaa", or "$aa
79a0: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
79b0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
79c0: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
79d0: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
79e0: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
79f0: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
7a00: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
7a10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
7a20: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
7a30: 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69   sequential vari
7a40: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
7a50: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
7a60: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
7a70: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
7a80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
7a90: 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e  pr *pExpr, u32 n
7aa0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7ab0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7ac0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7ad0: 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66    ynVar x;..  if
7ae0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
7af0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21  urn;.  assert( !
7b00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7b10: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
7b20: 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50  ue|EP_Reduced|EP
7b30: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20  _TokenOnly) );. 
7b40: 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54   z = pExpr->u.zT
7b50: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
7b60: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
7b70: 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61  ( z[0]!=0 );.  a
7b80: 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32 29 73  ssert( n==(u32)s
7b90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7ba0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  ) );.  if( z[1]=
7bb0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
7bc0: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
7bd0: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
7be0: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
7bf0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
7c00: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
7c10: 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79 6e 56   );.    x = (ynV
7c20: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
7c30: 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ar);.  }else{.  
7c40: 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20 30 3b    int doAdd = 0;
7c50: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
7c60: 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  ?' ){.      /* W
7c70: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
7c80: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
7c90: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
7ca0: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
7cb0: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
7cc0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
7cd0: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ber */.      i64
7ce0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   i;.      int bO
7cf0: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  k;.      if( n==
7d00: 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  2 ){ /*OPTIMIZAT
7d10: 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20  ION-IF-TRUE*/.  
7d20: 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d 2d 27        i = z[1]-'
7d30: 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  0';  /* The comm
7d40: 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20 66 6f  on case of ?N fo
7d50: 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67 69 74  r a single digit
7d60: 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f   N */.        bO
7d70: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  k = 1;.      }el
7d80: 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20  se{.        bOk 
7d90: 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  = 0==sqlite3Atoi
7da0: 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d  64(&z[1], &i, n-
7db0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  1, SQLITE_UTF8);
7dc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
7dd0: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
7de0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7df0: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74   i==1 );.      t
7e00: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
7e10: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7e20: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7e30: 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20  BER]-1 );.      
7e40: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
7e50: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7e60: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7e70: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69  MBER] );.      i
7e80: 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31  f( bOk==0 || i<1
7e90: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
7ea0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7eb0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
7ec0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7ed0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7ee0: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
7ef0: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
7f00: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
7f20: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7f30: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7f40: 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  BER]);.        r
7f50: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
7f60: 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29       x = (ynVar)
7f70: 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  i;.      if( x>p
7f80: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
7f90: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
7fa0: 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20  Var = (int)x;.  
7fb0: 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b        doAdd = 1;
7fc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7fd0: 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d   sqlite3VListNum
7fe0: 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70  ToName(pParse->p
7ff0: 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a  VList, x)==0 ){.
8000: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
8010: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
8020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
8030: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
8040: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
8050: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
8060: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
8070: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
8080: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
8090: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
80a0: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
80b0: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
80c0: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
80d0: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
80e0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
80f0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
8100: 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20     */.      x = 
8110: 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c  (ynVar)sqlite3VL
8120: 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61  istNameToNum(pPa
8130: 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20  rse->pVList, z, 
8140: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d  n);.      if( x=
8150: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20  =0 ){.        x 
8160: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
8170: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20  se->nVar);.     
8180: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
81a0: 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20  if( doAdd ){.   
81b0: 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
81c0: 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  t = sqlite3VList
81d0: 41 64 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  Add(db, pParse->
81e0: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29  pVList, z, n, x)
81f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
8200: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78  xpr->iColumn = x
8210: 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c  ;.  if( x>db->aL
8220: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8230: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
8240: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
8250: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8260: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
8270: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
8280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
8290: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
82a0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
82b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
82c0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
82d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
82e0: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
82f0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73   Expr *p){.  ass
8300: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f  ert( p!=0 );.  /
8310: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
8320: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
8330: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
8340: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
8350: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
8360: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
8370: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
8380: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
8390: 75 65 3e 3d 30 20 29 3b 0a 23 69 66 64 65 66 20  ue>=0 );.#ifdef 
83a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
83b0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
83c0: 74 79 28 70 2c 20 45 50 5f 4c 65 61 66 29 20 26  ty(p, EP_Leaf) &
83d0: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
83e0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
83f0: 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ly) ){.    asser
8400: 74 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29  t( p->pLeft==0 )
8410: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
8420: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
8440: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d  Select==0 );.  }
8450: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 45  .#endif.  if( !E
8460: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8470: 2c 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  , (EP_TokenOnly|
8480: 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20  EP_Leaf)) ){.   
8490: 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75   /* The Expr.x u
84a0: 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73  nion is never us
84b0: 65 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  ed at the same t
84c0: 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67  ime as Expr.pRig
84d0: 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ht */.    assert
84e0: 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  ( p->x.pList==0 
84f0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
8500: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  );.    if( p->pL
8510: 65 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b  eft && p->op!=TK
8520: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
8530: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8540: 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66  teNN(db, p->pLef
8550: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
8560: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
8570: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66  >pRight);.    if
8580: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8590: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
85a0: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
85b0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
85c0: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
85d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
85e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
85f0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
8600: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
8610: 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48  .  }.  if( ExprH
8620: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8630: 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c  _MemToken) ) sql
8640: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8650: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69  ->u.zToken);.  i
8660: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8670: 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63  rty(p, EP_Static
8680: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8690: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
86a0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
86b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
86c0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
86d0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73  *p){.  if( p ) s
86e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
86f0: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  NN(db, p);.}../*
8700: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
8710: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
8720: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
8730: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
8740: 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64  cture .** passed
8750: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
8760: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
8770: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58  always one of EX
8780: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20  PR_FULLSIZE,.** 
8790: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
87a0: 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   or EXPR_TOKENON
87b0: 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  LYSIZE..*/.stati
87c0: 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74  c int exprStruct
87d0: 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Size(Expr *p){. 
87e0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
87f0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8800: 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45  Only) ) return E
8810: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
8820: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
8830: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
8840: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
8850: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8860: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
8870: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
8880: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8890: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
88a0: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
88b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
88c0: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
88d0: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
88e0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
88f0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
8900: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
8910: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
8920: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
8930: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
8940: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
8950: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
8960: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
8970: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
8980: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
8990: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
89a0: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
89b0: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
89c0: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
89d0: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
89e0: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
89f0: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
8a00: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
8a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
8a50: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
8a60: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
8a70: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
8a80: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
8a90: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
8aa0: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
8ab0: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
8ac0: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
8ad0: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
8ae0: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
8af0: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
8b00: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
8b10: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
8b20: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
8b30: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
8b40: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
8b50: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
8b60: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
8b70: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
8b80: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
8b90: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
8ba0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
8bb0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
8bc0: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
8bd0: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
8be0: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
8bf0: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
8c00: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
8c10: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
8c20: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
8c30: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
8c40: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
8c50: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
8c60: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
8c70: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
8c80: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
8c90: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
8ca0: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
8cb0: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
8cc0: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
8cd0: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
8ce0: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
8cf0: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
8d00: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
8d10: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
8d20: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
8d30: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
8d40: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
8d50: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
8d60: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
8d70: 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63  f teh Expr objec
8d80: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
8d90: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
8da0: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
8db0: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
8dc0: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
8dd0: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
8de0: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
8df0: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
8e00: 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  an EXPRDUP_REDUC
8e10: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
8e20: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
8e30: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
8e40: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
8e50: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
8e60: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
8e70: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
8e80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
8e90: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
8ea0: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
8eb0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
8ec0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
8ed0: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
8ee0: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
8ef0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
8f00: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
8f10: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
8f20: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
8f30: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
8f40: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
8f50: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
8f60: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
8f70: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
8f80: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
8f90: 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f  .  assert( EXPR_
8fa0: 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20  FULLSIZE<=0xfff 
8fb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78  );.  assert( (0x
8fc0: 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65  fff & (EP_Reduce
8fd0: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29  d|EP_TokenOnly))
8fe0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d  ==0 );.  if( 0==
8ff0: 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  flags || p->op==
9000: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
9010: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   ){.    nSize = 
9020: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20  EXPR_FULLSIZE;. 
9030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
9040: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9050: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
9060: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
9070: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9080: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9090: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
90a0: 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28   ); .    assert(
90b0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
90c0: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
90d0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
90e0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
90f0: 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  y(p, EP_NoReduce
9100: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ) );.    if( p->
9110: 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c  pLeft || p->x.pL
9120: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  ist ){.      nSi
9130: 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45  ze = EXPR_REDUCE
9140: 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63  DSIZE | EP_Reduc
9150: 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ed;.    }else{. 
9160: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9170: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
9180: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
9190: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
91a0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
91b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
91c0: 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nSize;.}../*.**
91d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
91e0: 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63 65  eturns the space
91f0: 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69 72   in bytes requir
9200: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
9210: 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20  copy .** of the 
9220: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 61  Expr structure a
9230: 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  nd a copy of the
9240: 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73   Expr.u.zToken s
9250: 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a  tring (if that.*
9260: 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66 69  * string is defi
9270: 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ned.).*/.static 
9280: 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64  int dupedExprNod
9290: 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  eSize(Expr *p, i
92a0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
92b0: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
92c0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
92d0: 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a  flags) & 0xfff;.
92e0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
92f0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
9300: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
9310: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79  Token ){.    nBy
9320: 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
9330: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
9340: 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n)+1;.  }.  retu
9350: 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29  rn ROUND8(nByte)
9360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9370: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9380: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
9390: 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69  o create a dupli
93a0: 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  cate of the .** 
93b0: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
93c0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
93d0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63  rgument. The sec
93e0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
93f0: 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69  a.** mask contai
9400: 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58  ning EXPRDUP_XXX
9410: 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
9420: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
9430: 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20   includes space 
9440: 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  to create a copy
9450: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
9460: 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e  uct.** itself an
9470: 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66  d the buffer ref
9480: 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72  erred to by Expr
9490: 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e  .u.zToken, if an
94a0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
94b0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
94c0: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
94d0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
94e0: 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73  e includes .** s
94f0: 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74  pace to duplicat
9500: 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73  e all Expr nodes
9510: 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72   in the tree for
9520: 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66  med by Expr.pLef
9530: 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70  t .** and Expr.p
9540: 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20  Right variables 
9550: 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79  (but not for any
9560: 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e   structures poin
9570: 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65  ted to or .** de
9580: 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65  scended from the
9590: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72   Expr.x.pList or
95a0: 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20   Expr.x.pSelect 
95b0: 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73  variables)..*/.s
95c0: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
95d0: 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  xprSize(Expr *p,
95e0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
95f0: 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20  nt nByte = 0;.  
9600: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79  if( p ){.    nBy
9610: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  te = dupedExprNo
9620: 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  deSize(p, flags)
9630: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26  ;.    if( flags&
9640: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9650: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
9660: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9670: 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20  ->pLeft, flags) 
9680: 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  + dupedExprSize(
9690: 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73  p->pRight, flags
96a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
96b0: 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a  eturn nByte;.}..
96c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
96d0: 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
96e0: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  o sqlite3ExprDup
96f0: 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
9700: 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20  if pzBuffer .** 
9710: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
9720: 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73   *pzBuffer is as
9730: 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  sumed to point t
9740: 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65  o a buffer large
9750: 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73   enough .** to s
9760: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66  tore the copy of
9770: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74   expression p, t
9780: 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e  he copies of p->
9790: 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20  u.zToken.** (if 
97a0: 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64  applicable), and
97b0: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74   the copies of t
97c0: 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20  he p->pLeft and 
97d0: 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73  p->pRight expres
97e0: 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79  sions,.** if any
97f0: 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  . Before returni
9800: 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73  ng, *pzBuffer is
9810: 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73   set to the firs
9820: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a  t byte past the.
9830: 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ** portion of th
9840: 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20  e buffer copied 
9850: 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e  into by this fun
9860: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
9870: 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73   Expr *exprDup(s
9880: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
9890: 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67   *p, int dupFlag
98a0: 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72  s, u8 **pzBuffer
98b0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
98c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
98d0: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
98e0: 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20  .  u8 *zAlloc;  
98f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
9900: 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68  ry space from wh
9910: 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70  ich to build Exp
9920: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33  r object */.  u3
9930: 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20  2 staticFlag;   
9940: 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63      /* EP_Static
9950: 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62   if space not ob
9960: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
9970: 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  oc */..  assert(
9980: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
9990: 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72  rt( p );.  asser
99a0: 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c  t( dupFlags==0 |
99b0: 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52  | dupFlags==EXPR
99c0: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20  DUP_REDUCE );.  
99d0: 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72  assert( pzBuffer
99e0: 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d  ==0 || dupFlags=
99f0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
9a00: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
9a10: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
9a20: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
9a30: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
9a40: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
9a50: 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a      zAlloc = *pz
9a60: 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74  Buffer;.    stat
9a70: 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74  icFlag = EP_Stat
9a80: 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ic;.  }else{.   
9a90: 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65   zAlloc = sqlite
9aa0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
9ab0: 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  b, dupedExprSize
9ac0: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a  (p, dupFlags));.
9ad0: 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d      staticFlag =
9ae0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d   0;.  }.  pNew =
9af0: 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b   (Expr *)zAlloc;
9b00: 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ..  if( pNew ){.
9b10: 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53      /* Set nNewS
9b20: 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
9b30: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
9b40: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
9b50: 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79  ted to.    ** by
9b60: 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65   pNew. This is e
9b70: 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53  ither EXPR_FULLS
9b80: 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45  IZE, EXPR_REDUCE
9b90: 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20  DSIZE or.    ** 
9ba0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
9bb0: 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65  ZE. nToken is se
9bc0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
9bd0: 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65  of bytes consume
9be0: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
9bf0: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75  copy of the p->u
9c00: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28  .zToken string (
9c10: 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a  if any)..    */.
9c20: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
9c30: 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d  ed nStructSize =
9c40: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9c50: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
9c60: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  );.    const int
9c70: 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72   nNewSize = nStr
9c80: 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b  uctSize & 0xfff;
9c90: 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b  .    int nToken;
9ca0: 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
9cb0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9cc0: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
9cd0: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
9ce0: 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74    nToken = sqlit
9cf0: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
9d00: 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20  zToken) + 1;.   
9d10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54   }else{.      nT
9d20: 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  oken = 0;.    }.
9d30: 20 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73      if( dupFlags
9d40: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
9d50: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9d60: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
9d70: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ==0 );.      mem
9d80: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
9d90: 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  NewSize);.    }e
9da0: 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e  lse{.      u32 n
9db0: 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72  Size = (u32)expr
9dc0: 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20  StructSize(p);. 
9dd0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
9de0: 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20  oc, p, nSize);. 
9df0: 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45       if( nSize<E
9e00: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20  XPR_FULLSIZE ){ 
9e10: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
9e20: 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20  &zAlloc[nSize], 
9e30: 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  0, EXPR_FULLSIZE
9e40: 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  -nSize);.      }
9e50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
9e60: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
9e70: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
9e80: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
9e90: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
9ea0: 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ly. */.    pNew-
9eb0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
9ec0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
9ed0: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50  nly|EP_Static|EP
9ee0: 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  _MemToken);.    
9ef0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e  pNew->flags |= n
9f00: 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50  StructSize & (EP
9f10: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
9f20: 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77  nOnly);.    pNew
9f30: 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69  ->flags |= stati
9f40: 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43  cFlag;..    /* C
9f50: 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f  opy the p->u.zTo
9f60: 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61  ken string, if a
9f70: 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ny. */.    if( n
9f80: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63  Token ){.      c
9f90: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
9fa0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
9fb0: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
9fc0: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d  ewSize];.      m
9fd0: 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d  emcpy(zToken, p-
9fe0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  >u.zToken, nToke
9ff0: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  n);.    }..    i
a000: 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73  f( 0==((p->flags
a010: 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20  |pNew->flags) & 
a020: 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  (EP_TokenOnly|EP
a030: 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20  _Leaf)) ){.     
a040: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
a050: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
a060: 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  or pNew->x.pList
a070: 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   member. */.    
a080: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a090: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
a0a0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
a0b0: 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63    pNew->x.pSelec
a0c0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
a0d0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53  tDup(db, p->x.pS
a0e0: 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29  elect, dupFlags)
a0f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a100: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
a110: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
a120: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
a130: 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61  >x.pList, dupFla
a140: 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gs);.      }.   
a150: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20   }..    /* Fill 
a160: 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61  in pNew->pLeft a
a170: 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e  nd pNew->pRight.
a180: 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72   */.    if( Expr
a190: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
a1a0: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
a1b0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
a1c0: 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75      zAlloc += du
a1d0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
a1e0: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
a1f0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a200: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
a210: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
a220: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
a230: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
a240: 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20  >pLeft ?.       
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
a260: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
a270: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
a280: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20  UCE, &zAlloc) : 
a290: 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
a2a0: 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69  >pRight = p->pRi
a2b0: 67 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20  ght ?.          
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
a2d0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
a2e0: 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ht, EXPRDUP_REDU
a2f0: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
a300: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a310: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
a320: 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65          *pzBuffe
a330: 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20  r = zAlloc;.    
a340: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
a350: 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
a360: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
a370: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61  TokenOnly|EP_Lea
a380: 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  f) ){.        if
a390: 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53  ( pNew->op==TK_S
a3a0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  ELECT_COLUMN ){.
a3b0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
a3c0: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a3d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
a3e0: 72 74 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  rt( p->iColumn==
a3f0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
a400: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
a410: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
a420: 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68  ==0  || p->pRigh
a430: 74 3d 3d 70 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  t==p->pLeft );. 
a440: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a450: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a460: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
a470: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66  rDup(db, p->pLef
a480: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, 0);.        }
a490: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
a4a0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
a4b0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
a4c0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
a4d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
a4e0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
a4f0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72  .** Create and r
a500: 65 74 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70  eturn a deep cop
a510: 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20  y of the object 
a520: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
a530: 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
a540: 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e  t. If an OOM con
a550: 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e  dition is encoun
a560: 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  tered, NULL is r
a570: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74  eturned.** and t
a580: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
a590: 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f  led flag set..*/
a5a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a5b0: 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20  OMIT_CTE.static 
a5c0: 57 69 74 68 20 2a 77 69 74 68 44 75 70 28 73 71  With *withDup(sq
a5d0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
a5e0: 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65  *p){.  With *pRe
a5f0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  t = 0;.  if( p )
a600: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
a610: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73  = sizeof(*p) + s
a620: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
a630: 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20   (p->nCte-1);.  
a640: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
a650: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
a660: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
a670: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69   pRet ){.      i
a680: 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74  nt i;.      pRet
a690: 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65  ->nCte = p->nCte
a6a0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a6b0: 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
a6c0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
a6d0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
a6e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
a6f0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c  db, p->a[i].pSel
a700: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
a710: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c   pRet->a[i].pCol
a720: 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  s = sqlite3ExprL
a730: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  istDup(db, p->a[
a740: 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20  i].pCols, 0);.  
a750: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
a760: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
a770: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e  DbStrDup(db, p->
a780: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
a790: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a7a0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
a7b0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
a7c0: 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65  ithDup(x,y) 0.#e
a7d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
a7e0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
a7f0: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
a800: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
a810: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
a820: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
a830: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
a840: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
a850: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
a860: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
a870: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
a880: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
a890: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
a8a0: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
a8b0: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
a8c0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
a8d0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
a8e0: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
a8f0: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
a900: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
a910: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
a920: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
a930: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
a940: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
a950: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
a960: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
a970: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
a980: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
a990: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
a9a0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
a9b0: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
a9c0: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
a9d0: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
a9e0: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
a9f0: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
aa00: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
aa10: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
aa20: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
aa30: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
aa40: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
aa50: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
aa60: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
aa70: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
aa80: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
aa90: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
aaa0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
aab0: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
aac0: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
aad0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
aae0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
aaf0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
ab00: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
ab10: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
ab20: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
ab30: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
ab40: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
ab50: 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  || flags==EXPRDU
ab60: 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65  P_REDUCE );.  re
ab70: 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70  turn p ? exprDup
ab80: 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30  (db, p, flags, 0
ab90: 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73  ) : 0;.}.ExprLis
aba0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
abb0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
abc0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  b, ExprList *p, 
abd0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78  int flags){.  Ex
abe0: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
abf0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ac00: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
ac10: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
ac20: 0a 20 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53  .  Expr *pPriorS
ac30: 65 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20  electCol = 0;.  
ac40: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
ac50: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
ac60: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
ac70: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
ac80: 52 61 77 4e 4e 28 64 62 2c 20 0a 20 20 20 20 20  RawNN(db, .     
ac90: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
aca0: 70 4e 65 77 29 2b 73 69 7a 65 6f 66 28 70 4e 65  pNew)+sizeof(pNe
acb0: 77 2d 3e 61 5b 30 5d 29 2a 28 70 2d 3e 6e 45 78  w->a[0])*(p->nEx
acc0: 70 72 2d 31 29 20 29 3b 0a 20 20 69 66 28 20 70  pr-1) );.  if( p
acd0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
ace0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  0;.  pNew->nAllo
acf0: 63 20 3d 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  c = pNew->nExpr 
ad00: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  = p->nExpr;.  pI
ad10: 74 65 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20  tem = pNew->a;. 
ad20: 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61   pOldItem = p->a
ad30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ad40: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
ad50: 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b  tem++, pOldItem+
ad60: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f  +){.    Expr *pO
ad70: 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65  ldExpr = pOldIte
ad80: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78  m->pExpr;.    Ex
ad90: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
ada0: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
adb0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
adc0: 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c  db, pOldExpr, fl
add0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  ags);.    if( pO
ade0: 6c 64 45 78 70 72 20 0a 20 20 20 20 20 26 26 20  ldExpr .     && 
adf0: 70 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pOldExpr->op==TK
ae00: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20  _SELECT_COLUMN. 
ae10: 20 20 20 20 26 26 20 28 70 4e 65 77 45 78 70 72      && (pNewExpr
ae20: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29   = pItem->pExpr)
ae30: 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
ae40: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78    assert( pNewEx
ae50: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c  pr->iColumn==0 |
ae60: 7c 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 69  | i>0 );.      i
ae70: 66 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f  f( pNewExpr->iCo
ae80: 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lumn==0 ){.     
ae90: 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 45     assert( pOldE
aea0: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64  xpr->pLeft==pOld
aeb0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a  Expr->pRight );.
aec0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 53 65          pPriorSe
aed0: 6c 65 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78  lectCol = pNewEx
aee0: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77  pr->pLeft = pNew
aef0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
af00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
af10: 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
af20: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
af30: 28 20 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70  ( pItem[-1].pExp
af40: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
af50: 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72  assert( pNewExpr
af60: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d  ->iColumn==pItem
af70: 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  [-1].pExpr->iCol
af80: 75 6d 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  umn+1 );.       
af90: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 53   assert( pPriorS
afa0: 65 6c 65 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b  electCol==pItem[
afb0: 2d 31 5d 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74  -1].pExpr->pLeft
afc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
afd0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50  Expr->pLeft = pP
afe0: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20  riorSelectCol;. 
aff0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b000: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
b010: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b020: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
b030: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
b040: 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
b050: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b060: 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  dItem->zSpan);. 
b070: 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72     pItem->sortOr
b080: 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  der = pOldItem->
b090: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70  sortOrder;.    p
b0a0: 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a  Item->done = 0;.
b0b0: 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e      pItem->bSpan
b0c0: 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  IsTab = pOldItem
b0d0: 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20 20  ->bSpanIsTab;.  
b0e0: 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c    pItem->u = pOl
b0f0: 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20  dItem->u;.  }.  
b100: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
b110: 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73  /*.** If cursors
b120: 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77  , triggers, view
b130: 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
b140: 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64   are all omitted
b150: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69   from.** the bui
b160: 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66  ld, then none of
b170: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
b180: 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20  outines, except 
b190: 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53  for .** sqlite3S
b1a0: 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20  electDup(), can 
b1b0: 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74  be called. sqlit
b1c0: 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73  e3SelectDup() is
b1d0: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61   sometimes.** ca
b1e0: 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c  lled with a NULL
b1f0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
b200: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
b210: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
b220: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b230: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a  OMIT_TRIGGER) \.
b240: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
b250: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b260: 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  Y).SrcList *sqli
b270: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71  te3SrcListDup(sq
b280: 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
b290: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
b2a0: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  ){.  SrcList *pN
b2b0: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
b2c0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65  nt nByte;.  asse
b2d0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b2e0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b2f0: 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   0;.  nByte = si
b300: 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e  zeof(*p) + (p->n
b310: 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70  Src>0 ? sizeof(p
b320: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53  ->a[0]) * (p->nS
b330: 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e  rc-1) : 0);.  pN
b340: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
b350: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42  llocRawNN(db, nB
b360: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  yte );.  if( pNe
b370: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
b380: 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20  .  pNew->nSrc = 
b390: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
b3a0: 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->nSrc;.  for(i=
b3b0: 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b  0; i<p->nSrc; i+
b3c0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
b3d0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
b3e0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
b3f0: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
b400: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
b410: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
b420: 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
b430: 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ab;.    pNewItem
b440: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64  ->pSchema = pOld
b450: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  Item->pSchema;. 
b460: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61     pNewItem->zDa
b470: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
b480: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b490: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
b4a0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b4b0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
b4c0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b4d0: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
b4e0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
b4f0: 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ias = sqlite3DbS
b500: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b510: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
b520: 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20   pNewItem->fg = 
b530: 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20  pOldItem->fg;.  
b540: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
b550: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
b560: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65  iCursor;.    pNe
b570: 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  wItem->addrFillS
b580: 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61  ub = pOldItem->a
b590: 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20  ddrFillSub;.    
b5a0: 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74  pNewItem->regRet
b5b0: 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  urn = pOldItem->
b5c0: 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 69  regReturn;.    i
b5d0: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
b5e0: 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20  isIndexedBy ){. 
b5f0: 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75       pNewItem->u
b600: 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73  1.zIndexedBy = s
b610: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b620: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e  b, pOldItem->u1.
b630: 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  zIndexedBy);.   
b640: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
b650: 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64  >pIBIndex = pOld
b660: 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a  Item->pIBIndex;.
b670: 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d      if( pNewItem
b680: 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
b690: 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d  {.      pNewItem
b6a0: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20  ->u1.pFuncArg = 
b6b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b6c0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
b6d0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70  , pOldItem->u1.p
b6e0: 46 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29 3b  FuncArg, flags);
b6f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
b700: 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62  = pNewItem->pTab
b710: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61   = pOldItem->pTa
b720: 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  b;.    if( pTab 
b730: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  ){.      pTab->n
b740: 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  TabRef++;.    }.
b750: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
b760: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
b770: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
b780: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
b790: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
b7a0: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
b7b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b7c0: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
b7d0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
b7e0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
b7f0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
b800: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
b810: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
b820: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
b830: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
b840: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
b850: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
b860: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
b870: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
b880: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
b890: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
b8a0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
b8b0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
b8c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b8d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b8e0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
b8f0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
b900: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b910: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
b920: 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  Id = p->nId;.  p
b930: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  New->a = sqlite3
b940: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b950: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
b960: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
b970: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
b980: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b990: 65 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  eNN(db, pNew);. 
b9a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b9b0: 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
b9c0: 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65  because the size
b9d0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   of the allocati
b9e0: 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73  on for p->a[] is
b9f0: 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73   not.  ** necess
ba00: 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66  arily a power of
ba10: 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c   two, sqlite3IdL
ba20: 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20  istAppend() may 
ba30: 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20  not be called.  
ba40: 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63  ** on the duplic
ba50: 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74  ate created by t
ba60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  his function. */
ba70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
ba80: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
ba90: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
baa0: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
bab0: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
bac0: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
bad0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
bae0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65  p->a[i];.    pNe
baf0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
bb00: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
bb10: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
bb20: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
bb30: 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65  m->idx = pOldIte
bb40: 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65  m->idx;.  }.  re
bb50: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c  turn pNew;.}.Sel
bb60: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
bb70: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
bb80: 62 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70 2c  b, Select *pDup,
bb90: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
bba0: 65 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30 3b  elect *pRet = 0;
bbb0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78 74  .  Select *pNext
bbc0: 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a   = 0;.  Select *
bbd0: 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20 53  *pp = &pRet;.  S
bbe0: 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73 73  elect *p;..  ass
bbf0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
bc00: 66 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20 70  for(p=pDup; p; p
bc10: 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  =p->pPrior){.   
bc20: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d 20   Select *pNew = 
bc30: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
bc40: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
bc50: 2a 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  *p) );.    if( p
bc60: 4e 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  New==0 ) break;.
bc70: 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74      pNew->pEList
bc80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
bc90: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
bca0: 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ist, flags);.   
bcb0: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71   pNew->pSrc = sq
bcc0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
bcd0: 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61  db, p->pSrc, fla
bce0: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
bcf0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
bd00: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  xprDup(db, p->pW
bd10: 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  here, flags);.  
bd20: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
bd30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
bd40: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72  stDup(db, p->pGr
bd50: 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  oupBy, flags);. 
bd60: 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67     pNew->pHaving
bd70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
bd80: 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  p(db, p->pHaving
bd90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
bda0: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
bdb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
bdc0: 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  p(db, p->pOrderB
bdd0: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  y, flags);.    p
bde0: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
bdf0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  .    pNew->pNext
be00: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70 4e   = pNext;.    pN
be10: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
be20: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74      pNew->pLimit
be30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
be40: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  p(db, p->pLimit,
be50: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
be60: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
be70: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
be80: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67  p->pOffset, flag
be90: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c  s);.    pNew->iL
bea0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
beb0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
bec0: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  .    pNew->selFl
bed0: 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
bee0: 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65  s & ~SF_UsesEphe
bef0: 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d  meral;.    pNew-
bf00: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
bf10: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
bf20: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
bf30: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
bf40: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
bf50: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
bf60: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77   pNew->pWith = w
bf70: 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  ithDup(db, p->pW
bf80: 69 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ith);.    sqlite
bf90: 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
bfa0: 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65  New, p->zSelName
bfb0: 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 4e 65  );.    *pp = pNe
bfc0: 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70 4e 65  w;.    pp = &pNe
bfd0: 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  w->pPrior;.    p
bfe0: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  Next = pNew;.  }
bff0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
c000: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
c010: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
c020: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
c030: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
c040: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
c050: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
c060: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
c070: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
c080: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
c090: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
c0a0: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
c0b0: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
c0c0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
c0d0: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
c0e0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
c0f0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
c100: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
c110: 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72  ccurs, the entir
c120: 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20  e list is freed 
c130: 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  and.** NULL is r
c140: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e  eturned.  If non
c150: 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  -NULL is returne
c160: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  d, then it is gu
c170: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74  aranteed.** that
c180: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
c190: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
c1a0: 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70  appended..*/.Exp
c1b0: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
c1c0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
c1d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c1e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c1f0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c200: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c210: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
c220: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
c230: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
c240: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  L */.  Expr *pEx
c250: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
c260: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
c270: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
c280: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
c290: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
c2a0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
c2b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c2c0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
c2d0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
c2e0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
c2f0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
c300: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
c310: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
c320: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
c330: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
c340: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
c350: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
c360: 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ->nExpr = 0;.   
c370: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
c380: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
c390: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 4c  pList->nExpr==pL
c3a0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
c3b0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
c3c0: 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  w;.    pNew = sq
c3d0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
c3e0: 62 2c 20 70 4c 69 73 74 2c 20 0a 20 20 20 20 20  b, pList, .     
c3f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
c400: 70 4c 69 73 74 29 2b 28 32 2a 70 4c 69 73 74 2d  pList)+(2*pList-
c410: 3e 6e 41 6c 6c 6f 63 20 2d 20 31 29 2a 73 69 7a  >nAlloc - 1)*siz
c420: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
c430: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
c440: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
c450: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
c460: 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b     pList = pNew;
c470: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
c480: 6f 63 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70  oc *= 2;.  }.  p
c490: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
c4a0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
c4b0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d  ;.  memset(pItem
c4c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
c4d0: 65 6d 29 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  em));.  pItem->p
c4e0: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
c4f0: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e  return pList;..n
c500: 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a  o_mem:     .  /*
c510: 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d   Avoid leaking m
c520: 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20  emory if malloc 
c530: 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20  has failed. */. 
c540: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
c550: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
c560: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c570: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
c580: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c590: 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73  ../*.** pColumns
c5a0: 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72 6d 20   and pExpr form 
c5b0: 61 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d  a vector assignm
c5c0: 65 6e 74 20 77 68 69 63 68 20 69 73 20 70 61 72  ent which is par
c5d0: 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a 20  t of the SET.** 
c5e0: 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50 44  clause of an UPD
c5f0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ATE statement.  
c600: 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
c610: 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63 29 20          (a,b,c) 
c620: 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  = (expr1,expr2,e
c630: 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20  xpr3).** Or:    
c640: 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45 43  (a,b,c) = (SELEC
c650: 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e  T x,y,z FROM ...
c660: 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  .).**.** For eac
c670: 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 76 65  h term of the ve
c680: 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c  ctor assignment,
c690: 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e 74 72   append new entr
c6a0: 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78  ies to the.** ex
c6b0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c  pression list pL
c6c0: 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61 73  ist.  In the cas
c6d0: 65 20 6f 66 20 61 20 73 75 62 71 75 65 72 79 20  e of a subquery 
c6e0: 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70 70 65  on the RHS, appe
c6f0: 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f  nd.** TK_SELECT_
c700: 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f  COLUMN expressio
c710: 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  ns..*/.ExprList 
c720: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
c730: 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20 20  AppendVector(.  
c740: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c750: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
c760: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
c770: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
c780: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
c790: 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64   which to append
c7a0: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
c7b0: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f  */.  IdList *pCo
c7c0: 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c  lumns,      /* L
c7d0: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20  ist of names of 
c7e0: 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73 69 67  LHS of the assig
c7f0: 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20  nment */.  Expr 
c800: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
c810: 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70 72    /* Vector expr
c820: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70  ession to be app
c830: 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20  ended. Might be 
c840: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  NULL */.){.  sql
c850: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
c860: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a  e->db;.  int n;.
c870: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
c880: 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20 3f 20  First = pList ? 
c890: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
c8a0: 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20  ;.  /* pColumns 
c8b0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c  can only be NULL
c8c0: 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62   due to an OOM b
c8d0: 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63  ut an OOM will c
c8e0: 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69  ause an.  ** exi
c8f0: 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  t prior to this 
c900: 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20 69 6e  routine being in
c910: 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e  voked */.  if( N
c920: 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30  EVER(pColumns==0
c930: 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f  ) ) goto vector_
c940: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
c950: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 67  if( pExpr==0 ) g
c960: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
c970: 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49  d_error;..  /* I
c980: 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20 76  f the RHS is a v
c990: 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65 20 63  ector, then we c
c9a0: 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 63  an immediately c
c9b0: 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
c9c0: 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20   .  ** the size 
c9d0: 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c  of the RHS and L
c9e0: 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74 20 69  HS match.  But i
c9f0: 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20 53  f the RHS is a S
ca00: 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c  ELECT, .  ** wil
ca10: 64 63 61 72 64 73 20 28 22 2a 22 29 20 69 6e 20  dcards ("*") in 
ca20: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
ca30: 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d 75 73  f the SELECT mus
ca40: 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65  t be expanded be
ca50: 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e  fore.  ** we can
ca60: 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63 68 65   do the size che
ca70: 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74 68 65  ck, so defer the
ca80: 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e 74 69   size check unti
ca90: 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
caa0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45  n..  */.  if( pE
cab0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  xpr->op!=TK_SELE
cac0: 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e  CT && pColumns->
cad0: 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45  nId!=(n=sqlite3E
cae0: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
caf0: 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  xpr)) ){.    sql
cb00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
cb10: 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73  rse, "%d columns
cb20: 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c   assigned %d val
cb30: 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ues",.          
cb40: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d            pColum
cb50: 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20  ns->nId, n);.   
cb60: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
cb70: 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a  end_error;.  }..
cb80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
cb90: 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29  lumns->nId; i++)
cba0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 75 62  {.    Expr *pSub
cbb0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
cbc0: 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64  prForVectorField
cbd0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
cbe0: 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  i);.    pList = 
cbf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
cc00: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c  ppend(pParse, pL
cc10: 69 73 74 2c 20 70 53 75 62 45 78 70 72 29 3b 0a  ist, pSubExpr);.
cc20: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
cc30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cc40: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69  List->nExpr==iFi
cc50: 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20  rst+i+1 );.     
cc60: 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d   pList->a[pList-
cc70: 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
cc80: 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d  = pColumns->a[i]
cc90: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  .zName;.      pC
cca0: 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  olumns->a[i].zNa
ccb0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  me = 0;.    }.  
ccc0: 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  }..  if( !db->ma
ccd0: 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 70 45  llocFailed && pE
cce0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
ccf0: 43 54 20 26 26 20 41 4c 57 41 59 53 28 70 4c 69  CT && ALWAYS(pLi
cd00: 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 45 78  st!=0) ){.    Ex
cd10: 70 72 20 2a 70 46 69 72 73 74 20 3d 20 70 4c 69  pr *pFirst = pLi
cd20: 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45  st->a[iFirst].pE
cd30: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
cd40: 20 70 46 69 72 73 74 21 3d 30 20 29 3b 0a 20 20   pFirst!=0 );.  
cd50: 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74    assert( pFirst
cd60: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
cd70: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a  COLUMN );.     .
cd80: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
cd90: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
cda0: 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f 20 69  t in pRight so i
cdb0: 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  t will be delete
cdc0: 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 73 71  d when.    ** sq
cdd0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
cde0: 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ete() is called 
cdf0: 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 70  */.    pFirst->p
ce00: 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a 20  Right = pExpr;. 
ce10: 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20     pExpr = 0;.. 
ce20: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
ce30: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4c  he size of the L
ce40: 48 53 20 69 6e 20 69 54 61 62 6c 65 20 73 6f 20  HS in iTable so 
ce50: 74 68 61 74 20 77 65 20 63 61 6e 20 63 68 65 63  that we can chec
ce60: 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  k that.    ** th
ce70: 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 73 69  e RHS and LHS si
ce80: 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69 6e 67  zes match during
ce90: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
cea0: 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d  . */.    pFirst-
ceb0: 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d  >iTable = pColum
cec0: 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65  ns->nId;.  }..ve
ced0: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
cee0: 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  r:.  sqlite3Expr
cef0: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
cf00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69  );.  sqlite3IdLi
cf10: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  stDelete(db, pCo
cf20: 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e  lumns);.  return
cf30: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
cf40: 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72   Set the sort or
cf50: 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74  der for the last
cf60: 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20   element on the 
cf70: 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a  given ExprList..
cf80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
cf90: 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72  xprListSetSortOr
cfa0: 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  der(ExprList *p,
cfb0: 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29   int iSortOrder)
cfc0: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
cfd0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
cfe0: 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46   SQLITE_SO_UNDEF
cff0: 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45  INED<0 && SQLITE
d000: 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51  _SO_ASC>=0 && SQ
d010: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29  LITE_SO_DESC>0 )
d020: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
d030: 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  Expr>0 );.  if( 
d040: 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a  iSortOrder<0 ){.
d050: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
d060: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
d070: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
d080: 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74  O_ASC );.    ret
d090: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b  urn;.  }.  p->a[
d0a0: 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  p->nExpr-1].sort
d0b0: 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72  Order = (u8)iSor
d0c0: 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tOrder;.}../*.**
d0d0: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
d0e0: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d  t.a[].zName elem
d0f0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
d100: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
d110: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
d120: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
d130: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
d140: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
d150: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
d160: 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75    But pName shou
d170: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
d180: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
d190: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
d1a0: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
d1b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d1c0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
d1d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d1e0: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
d1f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d200: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
d210: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d220: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d230: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
d240: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
d250: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
d260: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
d270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
d280: 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  e to be added */
d290: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
d2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
d2b0: 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ue to cause the 
d2c0: 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f  name to be dequo
d2d0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ted */.){.  asse
d2e0: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
d2f0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
d300: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
d310: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
d320: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
d330: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
d340: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
d350: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
d360: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
d370: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
d380: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
d390: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
d3a0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
d3b0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
d3c0: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
d3d0: 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  b, pName->z, pNa
d3e0: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
d3f0: 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65  dequote ) sqlite
d400: 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e  3Dequote(pItem->
d410: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zName);.  }.}../
d420: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
d430: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
d440: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
d450: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
d460: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
d470: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
d480: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
d490: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
d4a0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
d4b0: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
d4c0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
d4d0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
d4e0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
d4f0: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
d500: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
d510: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
d520: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
d530: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
d540: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
d550: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
d560: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d570: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
d580: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
d590: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
d5a0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
d5b0: 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a   */.  ExprSpan *
d5c0: 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a  pSpan         /*
d5d0: 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20   The span to be 
d5e0: 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  added */.){.  sq
d5f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d600: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
d610: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
d620: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
d630: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
d640: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
d650: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
d660: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
d670: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
d680: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
d690: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
d6a0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
d6b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
d6c0: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70  Item->pExpr==pSp
d6d0: 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  an->pExpr );.   
d6e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d6f0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
d700: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
d710: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
d720: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
d730: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d760: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
d770: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
d780: 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start));.  }.}..
d790: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
d7a0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
d7b0: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
d7c0: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
d7d0: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
d7e0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
d7f0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
d800: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
d810: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
d820: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d830: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
d840: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
d850: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
d860: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
d870: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
d880: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
d890: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
d8a0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
d8b0: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
d8c0: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
d8d0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
d8e0: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
d8f0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
d900: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
d910: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d920: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
d930: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
d940: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
d950: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
d960: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
d970: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
d980: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
d990: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70  OINLINE void exp
d9a0: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71  rListDeleteNN(sq
d9b0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
d9c0: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
d9d0: 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nt i = pList->nE
d9e0: 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20 45 78  xpr;.  struct Ex
d9f0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
da00: 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b 0a  em =  pList->a;.
da10: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
da20: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 64 6f  >nExpr>0 );.  do
da30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
da40: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
da50: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  m->pExpr);.    s
da60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
da70: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
da80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
da90: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
daa0: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b 2b  an);.    pItem++
dab0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69 3e  ;.  }while( --i>
dac0: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  0 );.  sqlite3Db
dad0: 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74  FreeNN(db, pList
dae0: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
daf0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
db00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
db10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
db20: 20 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70   if( pList ) exp
db30: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62  rListDeleteNN(db
db40: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
db50: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
db60: 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20  twise-OR of all 
db70: 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64  Expr.flags field
db80: 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a  s in the given.*
db90: 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75  * ExprList..*/.u
dba0: 33 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  32 sqlite3ExprLi
dbb0: 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78  stFlags(const Ex
dbc0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
dbd0: 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d    int i;.  u32 m
dbe0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 0;.  if( pLis
dbf0: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
dc00: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
dc10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45  ; i++){.       E
dc20: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
dc30: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
dc40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
dc50: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
dc60: 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c    m |= pExpr->fl
dc70: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ags;.    }.  }. 
dc80: 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a   return m;.}../*
dc90: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
dca0: 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61  es are Walker ca
dcb0: 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20  llbacks used to 
dcc0: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
dcd0: 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74  s to.** see if t
dce0: 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e  hey are "constan
dcf0: 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69  t" for some defi
dd00: 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61  nition of consta
dd10: 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b  nt.  The.** Walk
dd20: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64  er.eCode value d
dd30: 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79  etermines the ty
dd40: 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22  pe of "constant"
dd50: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a   we are looking.
dd60: 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ** for..**.** Th
dd70: 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ese callback rou
dd80: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
dd90: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
dda0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
ddb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ddc0: 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  IsConstant()    
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
dde0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a  alker->eCode==1.
ddf0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
de00: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
de10: 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20  oin()           
de20: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
de30: 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  2.**     sqlite3
de40: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
de50: 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20  ant()           
de60: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
de70: 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ==3.**     sqlit
de80: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
de90: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20  OrFunction()    
dea0: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
deb0: 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a  de==4 or 5.**.**
dec0: 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74   In all cases, t
ded0: 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74  he callbacks set
dee0: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20   Walker.eCode=0 
def0: 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65  and abort if the
df00: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
df10: 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62  s found to not b
df20: 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a  e a constant..**
df30: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
df40: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
df50: 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65  unction() is use
df60: 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  d for evaluating
df70: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
df80: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
df90: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
dfa0: 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76  e Walker.eCode v
dfb0: 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70  alue is 5 when p
dfc0: 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69  arsing.** an exi
dfd0: 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64  sting schema and
dfe0: 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69   4 when processi
dff0: 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65  ng a new stateme
e000: 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20  nt.  A bound.** 
e010: 70 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73  parameter raises
e020: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65   an error for ne
e030: 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75  w statements, bu
e040: 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f  t is silently co
e050: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55  nverted.** to NU
e060: 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  LL for existing 
e070: 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61  schemas.  This a
e080: 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73  llows sqlite_mas
e090: 74 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20  ter tables that 
e0a0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f  .** contain a bo
e0b0: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65  und parameter be
e0c0: 63 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20  cause they were 
e0d0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64  generated by old
e0e0: 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  er versions.** o
e0f0: 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70  f SQLite to be p
e100: 61 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76  arsed by newer v
e110: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
e120: 65 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e  e without raisin
e130: 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  g a.** malformed
e140: 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a   schema error..*
e150: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
e160: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
e170: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
e180: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a   Expr *pExpr){..
e190: 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d    /* If pWalker-
e1a0: 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e  >eCode is 2 then
e1b0: 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65   any term of the
e1c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
e1d0: 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a   comes from.  **
e1e0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
e1f0: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65   clauses of a le
e200: 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69  ft join disquali
e210: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
e220: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
e230: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
e240: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
e250: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
e260: 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72  ==2 && ExprHasPr
e270: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
e280: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
e290: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
e2a0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
e2b0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
e2c0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
e2d0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
e2e0: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
e2f0: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
e300: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
e310: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
e320: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
e330: 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e  either pWalker->
e340: 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72  eCode==4 or 5 or
e350: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61   the function ha
e360: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  s the.    ** SQL
e370: 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66  ITE_FUNC_CONST f
e380: 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65  lag. */.    case
e390: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
e3a0: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
e3b0: 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70  >eCode>=4 || Exp
e3c0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
e3d0: 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29  pr,EP_ConstFunc)
e3e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e3f0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
e400: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e410: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e420: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
e430: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e440: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
e450: 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20  case TK_ID:.    
e460: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a  case TK_COLUMN:.
e470: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
e480: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
e490: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
e4a0: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
e4b0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e4c0: 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ID );.      test
e4d0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
e4e0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
e4f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e500: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
e510: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
e520: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
e530: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
e540: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66  LUMN );.      if
e550: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
e560: 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ==3 && pExpr->iT
e570: 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
e580: 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  .iCur ){.       
e590: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
e5a0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
e5b0: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
e5c0: 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
e5d0: 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a  TK_IF_NULL_ROW:.
e5e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e5f0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46  pExpr->op==TK_IF
e600: 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20  _NULL_ROW );.   
e610: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e620: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
e630: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
e640: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
e650: 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70  BLE:.      if( p
e660: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35  Walker->eCode==5
e670: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
e680: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20  ilently convert 
e690: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73  bound parameters
e6a0: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73   that appear ins
e6b0: 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20  ide of CREATE.  
e6c0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
e6d0: 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20  nts into a NULL 
e6e0: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65  when parsing the
e6f0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
e700: 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20  t text out.     
e710: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c     ** of the sql
e720: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
e730: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70   */.        pExp
e740: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
e750: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e760: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
e770: 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =4 ){.        /*
e780: 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74   A bound paramet
e790: 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73  er in a CREATE s
e7a0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72  tatement that or
e7b0: 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20  iginates from.  
e7c0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
e7d0: 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65  _prepare() cause
e7e0: 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
e7f0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e800: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
e810: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e820: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
e830: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
e840: 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74  h */.    default
e850: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
e860: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e870: 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c  SELECT ); /* sel
e880: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
e890: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
e8a0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
e8b0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
e8c0: 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65  _EXISTS ); /* se
e8d0: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
e8e0: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
e8f0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
e900: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
e910: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20   }.}.static int 
e920: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
e930: 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  tant(Walker *pWa
e940: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  lker, Select *No
e950: 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
e960: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
e970: 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ed);.  pWalker->
e980: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74  eCode = 0;.  ret
e990: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d  urn WRC_Abort;.}
e9a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
e9b0: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
e9c0: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69   int initFlag, i
e9d0: 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b  nt iCur){.  Walk
e9e0: 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
e9f0: 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e  = initFlag;.  w.
ea00: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
ea10: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
ea20: 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
ea30: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
ea40: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
ea50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
ea60: 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  BUG.  w.xSelectC
ea70: 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74  allback2 = sqlit
ea80: 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65  e3SelectWalkAsse
ea90: 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 77 2e  rt2;.#endif.  w.
eaa0: 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  u.iCur = iCur;. 
eab0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
eac0: 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
ead0: 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
eae0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
eaf0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
eb00: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
eb10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
eb20: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
eb30: 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
eb40: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
eb50: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e   function calls.
eb60: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
eb70: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
eb80: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
eb90: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
eba0: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
ebb0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
ebc0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
ebd0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
ebe0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
ebf0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
ec00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ec10: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45  ExprIsConstant(E
ec20: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
ec30: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
ec40: 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   1, 0);.}../*.**
ec50: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
ec60: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
ec70: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
ec80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ec90: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74  constant.** that
eca0: 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61   does no origina
ecb0: 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f  te from the ON o
ecc0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
ecd0: 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65  of a join..** Re
ece0: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76  turn 0 if it inv
ecf0: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
ed00: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
ed10: 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a  s or terms from.
ed20: 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e  ** an ON or USIN
ed30: 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  G clause..*/.int
ed40: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
ed50: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78  nstantNotJoin(Ex
ed60: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
ed70: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
ed80: 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2, 0);.}../*.** 
ed90: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
eda0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
edb0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
edc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
edd0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61  onstant.** for a
ede0: 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66  ny single row of
edf0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
ee00: 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e  cursor iCur.  In
ee10: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
ee20: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
ee30: 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74  must not refer t
ee40: 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d  o any non-determ
ee50: 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e  inistic function
ee60: 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c   nor any.** tabl
ee70: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75  e other than iCu
ee80: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
ee90: 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
eea0: 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  tant(Expr *p, in
eeb0: 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72  t iCur){.  retur
eec0: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
eed0: 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f   3, iCur);.}.../
eee0: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b  *.** sqlite3Walk
eef0: 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20  Expr() callback 
ef00: 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 45  used by sqlite3E
ef10: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  xprIsConstantOrG
ef20: 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61  roupBy()..*/.sta
ef30: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
ef40: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75  IsConstantOrGrou
ef50: 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  pBy(Walker *pWal
ef60: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
ef70: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
ef80: 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65  GroupBy = pWalke
ef90: 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20  r->u.pGroupBy;. 
efa0: 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68   int i;..  /* Ch
efb0: 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20  eck if pExpr is 
efc0: 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79  identical to any
efd0: 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20   GROUP BY term. 
efe0: 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a  If so, consider.
eff0: 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74    ** it constant
f000: 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
f010: 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
f020: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
f030: 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79  pr *p = pGroupBy
f040: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
f050: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
f060: 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 20  rCompare(pExpr, 
f070: 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20  p, -1)<2 ){.    
f080: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
f090: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
f0a0: 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70  llSeq(pWalker->p
f0b0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
f0c0: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( pColl==0 ||
f0d0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
f0e0: 28 22 42 49 4e 41 52 59 22 2c 20 70 43 6f 6c 6c  ("BINARY", pColl
f0f0: 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ->zName)==0 ){. 
f100: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
f110: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
f120: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f130: 20 43 68 65 63 6b 20 69 66 20 70 45 78 70 72 20   Check if pExpr 
f140: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
f150: 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72   If so, consider
f160: 20 69 74 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f   it variable. */
f170: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
f180: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
f190: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
f1a0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
f1b0: 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  e = 0;.    retur
f1c0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
f1d0: 0a 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 4e  ..  return exprN
f1e0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 70 57  odeIsConstant(pW
f1f0: 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d  alker, pExpr);.}
f200: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65  ../*.** Walk the
f210: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
f220: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
f230: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52  irst argument. R
f240: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  eturn non-zero.*
f250: 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  * if the express
f260: 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  ion consists ent
f270: 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e  irely of constan
f280: 74 73 20 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  ts or copies of 
f290: 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72  terms .** in pGr
f2a0: 6f 75 70 42 79 20 74 68 61 74 20 73 6f 72 74 20  oupBy that sort 
f2b0: 77 69 74 68 20 74 68 65 20 42 49 4e 41 52 59 20  with the BINARY 
f2c0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
f2d0: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ce..**.** This r
f2e0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
f2f0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  o determine if a
f300: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56   term of the HAV
f310: 49 4e 47 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a  ING clause can.*
f320: 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e  * be promoted in
f330: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
f340: 75 73 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 66  use.  In order f
f350: 6f 72 20 73 75 63 68 20 61 20 70 72 6f 6d 6f 74  or such a promot
f360: 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20  ion to work,.** 
f370: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
f380: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 74   HAVING clause t
f390: 65 72 6d 20 6d 75 73 74 20 62 65 20 74 68 65 20  erm must be the 
f3a0: 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d  same for all mem
f3b0: 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72  bers of.** a "gr
f3c0: 6f 75 70 22 2e 20 20 54 68 65 20 72 65 71 75 69  oup".  The requi
f3d0: 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  rement that the 
f3e0: 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20 6d 75  GROUP BY term mu
f3f0: 73 74 20 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20  st be BINARY.** 
f400: 61 73 73 75 6d 65 73 20 74 68 61 74 20 6e 6f 20  assumes that no 
f410: 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20  other collating 
f420: 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 68 61  sequence will ha
f430: 76 65 20 61 20 66 69 6e 65 72 2d 67 72 61 69 6e  ve a finer-grain
f440: 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74  ed.** grouping t
f450: 68 61 6e 20 62 69 6e 61 72 79 2e 20 20 49 6e 20  han binary.  In 
f460: 6f 74 68 65 72 20 77 6f 72 64 73 20 28 41 3d 42  other words (A=B
f470: 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 29   COLLATE binary)
f480: 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20   implies.** A=B 
f490: 69 6e 20 65 76 65 72 79 20 6f 74 68 65 72 20 63  in every other c
f4a0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
f4b0: 65 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d  e.  The requirem
f4c0: 65 6e 74 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ent that the.** 
f4d0: 47 52 4f 55 50 20 42 59 20 62 65 20 42 49 4e 41  GROUP BY be BINA
f4e0: 52 59 20 69 73 20 73 74 72 69 63 74 65 72 20 74  RY is stricter t
f4f0: 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 20  han necessary.  
f500: 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f  It would also wo
f510: 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65  rk.** to promote
f520: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20   HAVING clauses 
f530: 74 68 61 74 20 75 73 65 20 74 68 65 20 73 61 6d  that use the sam
f540: 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  e alternative co
f550: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
f560: 6e 63 65 20 61 73 20 74 68 65 20 47 52 4f 55 50  nce as the GROUP
f570: 20 42 59 20 74 65 72 6d 2c 20 62 75 74 20 74 68   BY term, but th
f580: 61 74 20 69 73 20 6d 75 63 68 20 68 61 72 64 65  at is much harde
f590: 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61  r to check,.** a
f5a0: 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
f5b0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61  ting sequences a
f5c0: 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64  re uncommon, and
f5d0: 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e   this is only an
f5e0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
f5f0: 2c 20 73 6f 20 77 65 20 74 61 6b 65 20 74 68 65  , so we take the
f600: 20 65 61 73 79 20 77 61 79 20 6f 75 74 20 61 6e   easy way out an
f610: 64 20 73 69 6d 70 6c 79 20 72 65 71 75 69 72 65  d simply require
f620: 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59   the.** GROUP BY
f630: 20 74 6f 20 75 73 65 20 74 68 65 20 42 49 4e 41   to use the BINA
f640: 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  RY collating seq
f650: 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  uence..*/.int sq
f660: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f670: 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 50 61 72  antOrGroupBy(Par
f680: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
f690: 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70   *p, ExprList *p
f6a0: 47 72 6f 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b  GroupBy){.  Walk
f6b0: 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
f6c0: 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  = 1;.  w.xExprCa
f6d0: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
f6e0: 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  eIsConstantOrGro
f6f0: 75 70 42 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63  upBy;.  w.xSelec
f700: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tCallback = 0;. 
f710: 20 77 2e 75 2e 70 47 72 6f 75 70 42 79 20 3d 20   w.u.pGroupBy = 
f720: 70 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50  pGroupBy;.  w.pP
f730: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
f740: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
f750: 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
f760: 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
f770: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
f780: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
f790: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
f7a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f7b0: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
f7c0: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
f7d0: 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
f7e0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
f7f0: 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
f800: 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
f810: 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
f820: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
f830: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
f840: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
f850: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
f860: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
f870: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
f880: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
f890: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
f8a0: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
f8b0: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
f8c0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f8d0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
f8e0: 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e  Expr *p, u8 isIn
f8f0: 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  it){.  assert( i
f900: 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e  sInit==0 || isIn
f910: 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  it==1 );.  retur
f920: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
f930: 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d   4+isInit, 0);.}
f940: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f950: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
f960: 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  NTS./*.** Walk a
f970: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
f980: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
f990: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
f9a0: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62  ontains a.** sub
f9b0: 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69  query of some ki
f9c0: 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  nd.  Return 0 if
f9d0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73 75   there are no su
f9e0: 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74  bqueries..*/.int
f9f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74   sqlite3ExprCont
fa00: 61 69 6e 73 53 75 62 71 75 65 72 79 28 45 78 70  ainsSubquery(Exp
fa10: 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20  r *p){.  Walker 
fa20: 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31  w;.  w.eCode = 1
fa30: 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
fa40: 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
fa50: 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78  rWalkNoop;.  w.x
fa60: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
fa70: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
fa80: 73 74 61 6e 74 3b 0a 23 69 66 64 65 66 20 53 51  stant;.#ifdef SQ
fa90: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78  LITE_DEBUG.  w.x
faa0: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
fab0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  = sqlite3SelectW
fac0: 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64  alkAssert2;.#end
fad0: 69 66 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  if.  sqlite3Walk
fae0: 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
faf0: 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30  eturn w.eCode==0
fb00: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
fb10: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
fb20: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
fb30: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
fb40: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
fb50: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
fb60: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
fb70: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
fb80: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
fb90: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
fba0: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
fbb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
fbc0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
fbd0: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
fbe0: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
fbf0: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
fc00: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
fc10: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
fc20: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
fc30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
fc40: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
fc50: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
fc60: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  e){.  int rc = 0
fc70: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
fc80: 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e  eturn 0;  /* Can
fc90: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c   only happen fol
fca0: 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f  lowing on OOM */
fcb0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70  ..  /* If an exp
fcc0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e  ression is an in
fcd0: 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68  teger literal th
fce0: 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69 67  at fits in a sig
fcf0: 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20  ned 32-bit.  ** 
fd00: 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68  integer, then th
fd10: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
fd20: 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  ag will have alr
fd30: 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f  eady been set */
fd40: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
fd50: 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  !=TK_INTEGER || 
fd60: 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  (p->flags & EP_I
fd70: 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20  ntValue)!=0.    
fd80: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
fd90: 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a  3GetInt32(p->u.z
fda0: 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29  Token, &rc)==0 )
fdb0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  ;..  if( p->flag
fdc0: 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
fdd0: 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d  ){.    *pValue =
fde0: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20   p->u.iValue;.  
fdf0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
fe00: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
fe10: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  ){.    case TK_U
fe20: 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63  PLUS: {.      rc
fe30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73   = sqlite3ExprIs
fe40: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
fe50: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , pValue);.     
fe60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
fe70: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
fe80: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
fe90: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
fea0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
feb0: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
fec0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
fed0: 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37   v!=(-2147483647
fee0: 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  -1) );.        *
fef0: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
ff00: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
ff10: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
ff20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
ff30: 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ult: break;.  }.
ff40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ff50: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c  /*.** Return FAL
ff60: 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  SE if there is n
ff70: 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
ff80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
ff90: 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   be NULL..**.** 
ffa0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
ffb0: 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  n might be NULL 
ffc0: 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73  or if the expres
ffd0: 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70  sion is too comp
ffe0: 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72  lex.** to tell r
fff0: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a  eturn TRUE.  .**
10000 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10010 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f   is used as an o
10020 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20  ptimization, to 
10030 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f  skip OP_IsNull o
10040 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77  pcodes.** when w
10050 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61  e know that a va
10060 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55  lue cannot be NU
10070 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61  LL.  Hence, a fa
10080 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20  lse positive.** 
10090 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20  (returning TRUE 
100a0 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65  when in fact the
100b0 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
100c0 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d  never be NULL) m
100d0 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61  ight.** be a sma
100e0 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  ll performance h
100f0 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72 77  it but is otherw
10100 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f  ise harmless.  O
10110 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68  n the other.** h
10120 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67  and, a false neg
10130 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67  ative (returning
10140 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20   FALSE when the 
10150 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20  result could be 
10160 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69  NULL).** will li
10170 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
10180 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77  n incorrect answ
10190 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20  er.  So when in 
101a0 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a  doubt, return.**
101b0 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71   TRUE..*/.int sq
101c0 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
101d0 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ll(const Expr *p
101e0 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68  ){.  u8 op;.  wh
101f0 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
10200 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  PLUS || p->op==T
10210 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20  K_UMINUS ){ p = 
10220 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70  p->pLeft; }.  op
10230 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
10240 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
10250 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
10260 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
10270 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
10280 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ER:.    case TK_
10290 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65  STRING:.    case
102a0 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
102b0 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20  ase TK_BLOB:.   
102c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
102d0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
102e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
102f0 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ->pTab!=0 );.   
10300 20 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61     return ExprHa
10310 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
10320 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20  CanBeNull) ||.  
10330 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69             (p->i
10340 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e  Column>=0 && p->
10350 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43  pTab->aCol[p->iC
10360 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
10370 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  0);.    default:
10380 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
10390 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
103a0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
103b0 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
103c0 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  n is a constant 
103d0 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a  which would be.*
103e0 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f  * unchanged by O
103f0 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68 20  P_Affinity with 
10400 74 68 65 20 61 66 66 69 6e 69 74 79 20 67 69 76  the affinity giv
10410 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64  en in the second
10420 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
10430 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10440 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
10450 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f  rmine if the OP_
10460 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69  Affinity operati
10470 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69  on.** can be omi
10480 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64  tted.  When in d
10490 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53  oubt return FALS
104a0 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61  E.  A false nega
104b0 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c  tive.** is harml
104c0 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f  ess.  A false po
104d0 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c  sitive, however,
104e0 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74   can result in t
104f0 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77  he wrong.** answ
10500 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
10510 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
10520 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73  inityChange(cons
10530 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20  t Expr *p, char 
10540 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20  aff){.  u8 op;. 
10550 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45   if( aff==SQLITE
10560 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75  _AFF_BLOB ) retu
10570 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 1;.  while( p
10580 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
10590 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
105a0 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65  US ){ p = p->pLe
105b0 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ft; }.  op = p->
105c0 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
105d0 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
105e0 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
105f0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
10600 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
10610 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
10620 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
10630 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
10640 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
10650 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10660 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
10670 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
10680 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c  LITE_AFF_REAL ||
10690 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
106a0 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a  _NUMERIC;.    }.
106b0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
106c0 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  NG: {.      retu
106d0 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
106e0 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20  FF_TEXT;.    }. 
106f0 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
10700 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
10710 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
10720 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
10730 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
10740 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a  iTable>=0 );  /*
10750 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72   p cannot be par
10760 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e  t of a CHECK con
10770 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
10780 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75   return p->iColu
10790 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26  mn<0.          &
107a0 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
107b0 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
107c0 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
107d0 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  MERIC);.    }.  
107e0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
107f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
10800 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
10810 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
10820 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
10830 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75  is a row-id colu
10840 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  mn name..*/.int 
10850 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63  sqlite3IsRowid(c
10860 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
10870 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
10880 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
10890 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
108a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
108b0 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  rICmp(z, "ROWID"
108c0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
108d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
108e0 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d  rICmp(z, "OID")=
108f0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
10900 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
10910 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20 52 48  .** pX is the RH
10920 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  S of an IN opera
10930 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73 20 61  tor.  If pX is a
10940 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10950 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62  t .** that can b
10960 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20  e simplified to 
10970 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 61  a direct table a
10980 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75  ccess, then retu
10990 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
109a0 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  to the SELECT st
109b0 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20  atement.  If pX 
109c0 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  is not a SELECT 
109d0 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72  statement,.** or
109e0 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   if the SELECT s
109f0 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74  tatement needs t
10a00 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20  o be manifested 
10a10 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74  into a transient
10a20 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  .** table, then 
10a30 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
10a40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10a50 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61  MIT_SUBQUERY.sta
10a60 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61  tic Select *isCa
10a70 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
10a80 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c  Expr *pX){.  Sel
10a90 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73  ect *p;.  SrcLis
10aa0 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
10ab0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
10ac0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
10ad0 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72  t i;.  if( !Expr
10ae0 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
10af0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20  EP_xIsSelect) ) 
10b00 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f  return 0;  /* No
10b10 74 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  t a subquery */.
10b20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
10b30 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72  perty(pX, EP_Var
10b40 53 65 6c 65 63 74 29 20 20 29 20 72 65 74 75 72  Select)  ) retur
10b50 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61  n 0;  /* Correla
10b60 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20  ted subq */.  p 
10b70 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  = pX->x.pSelect;
10b80 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
10b90 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
10bb0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
10bc0 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  CT */.  if( p->s
10bd0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
10be0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
10bf0 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74  ate) ){.    test
10c00 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
10c10 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
10c20 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
10c30 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
10c40 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
10c50 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
10c60 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
10c70 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
10c80 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72  gregate );.    r
10c90 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44  eturn 0; /* No D
10ca0 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
10cb0 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
10cc0 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
10cd0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
10ce0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20  GroupBy==0 );   
10cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
10d00 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
10d10 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
10d20 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
10d30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10d40 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
10d50 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73   clause */.  ass
10d60 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
10d70 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
10d80 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20      /* No LIMIT 
10d90 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20  means no OFFSET 
10da0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  */.  if( p->pWhe
10db0 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
10dd0 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
10de0 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70  se */.  pSrc = p
10df0 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
10e00 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69  ( pSrc!=0 );.  i
10e10 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  f( pSrc->nSrc!=1
10e20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10e30 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20        /* Single 
10e40 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61  term in FROM cla
10e50 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  use */.  if( pSr
10e60 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  c->a[0].pSelect 
10e70 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
10e80 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61  /* FROM is not a
10e90 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65   subquery or vie
10ea0 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53  w */.  pTab = pS
10eb0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
10ec0 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
10ed0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
10ee0 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
10ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10f00 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e  FROM clause is n
10f10 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69  ot a view */.  i
10f20 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
10f30 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  b) ) return 0;  
10f40 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
10f50 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75  ause not a virtu
10f60 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45  al table */.  pE
10f70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
10f80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
10f90 73 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c  st!=0 );.  /* Al
10fa0 6c 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73  l SELECT results
10fb0 20 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73   must be columns
10fc0 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
10fd0 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
10fe0 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
10ff0 2a 70 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e  *pRes = pEList->
11000 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
11010 69 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b  if( pRes->op!=TK
11020 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
11030 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
11040 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  pRes->iTable==pS
11050 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
11060 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f   );  /* Not a co
11070 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
11080 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  y */.  }.  retur
11090 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n p;.}.#endif /*
110a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
110b0 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
110c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
110d0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
110e0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
110f0 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d  checks the left-
11100 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  most column of i
11110 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75 72 20  ndex table iCur 
11120 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20  to see if.** it 
11130 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
11140 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73  L entries.  Caus
11150 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20 61  e the register a
11160 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20  t regHasNull to 
11170 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e  be set.** to a n
11180 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
11190 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e   iCur contains n
111a0 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20  o NULLs.  Cause 
111b0 72 65 67 69 73 74 65 72 20 72 65 67 48 61 73 4e  register regHasN
111c0 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74  ull.** to be set
111d0 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72   to NULL if iCur
111e0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
111f0 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65   more NULL value
11200 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
11210 64 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e  d sqlite3SetHasN
11220 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c  ullFlag(Vdbe *v,
11230 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72   int iCur, int r
11240 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e  egHasNull){.  in
11250 74 20 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74  t addr1;.  sqlit
11260 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11270 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
11280 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64  egHasNull);.  ad
11290 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
112a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
112b0 77 69 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62  wind, iCur); Vdb
112c0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
112d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
112e0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
112f0 69 43 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  iCur, 0, regHasN
11300 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ull);.  sqlite3V
11310 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
11320 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29  PFLAG_TYPEOFARG)
11330 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
11340 28 76 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79  (v, "first_entry
11350 5f 69 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29  _in(%d)", iCur))
11360 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
11370 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
11380 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
11390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
113a0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
113b0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
113c0 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
113d0 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74  with a list (not
113e0 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20   a subquery) on 
113f0 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61  the .** right-ha
11400 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e  nd side.  Return
11410 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c 69   TRUE if that li
11420 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a  st is constant..
11430 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
11440 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73  lite3InRhsIsCons
11450 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b  tant(Expr *pIn){
11460 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20  .  Expr *pLHS;. 
11470 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65   int res;.  asse
11480 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
11490 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73  erty(pIn, EP_xIs
114a0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48  Select) );.  pLH
114b0 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a  S = pIn->pLeft;.
114c0 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30    pIn->pLeft = 0
114d0 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65  ;.  res = sqlite
114e0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
114f0 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65  pIn);.  pIn->pLe
11500 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74  ft = pLHS;.  ret
11510 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69  urn res;.}.#endi
11520 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
11530 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
11540 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
11550 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28  tion of the IN (
11560 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ...) operator..*
11570 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65 74  * The pX paramet
11580 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65 73  er is the expres
11590 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20  sion on the RHS 
115a0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
115b0 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  or, which.** mig
115c0 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20 6c  ht be either a l
115d0 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
115e0 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  ns or a subquery
115f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
11600 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
11610 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
11620 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62  eate a b-tree ob
11630 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a  ject that can.**
11640 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72 20   be used either 
11650 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62  to test for memb
11660 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52 48  ership in the RH
11670 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72  S set or to iter
11680 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61  ate through.** a
11690 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68  ll members of th
116a0 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70  e RHS set, skipp
116b0 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ing duplicates..
116c0 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69  **.** A cursor i
116d0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
116e0 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68  b-tree object th
116f0 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  at is the RHS of
11700 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
11710 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62  .** and pX->iTab
11720 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  le is set to the
11730 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
11740 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
11750 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
11760 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
11770 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62   indicates the b
11780 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66  -tree type, as f
11790 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
117a0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20  IN_INDEX_ROWID  
117b0 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
117c0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
117d0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
117e0 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
117f0 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20  NDEX_ASC  - The 
11800 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
11810 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  d on an ascendin
11820 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
11830 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
11840 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  C - The cursor w
11850 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
11860 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  escending index.
11870 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
11880 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65 20  PH        - The 
11890 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
118a0 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79  d on a specially
118b0 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65          populate
118e0 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  d epheremal tabl
118f0 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
11900 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f  _NOOP       - No
11910 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f   cursor was allo
11920 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f  cated.  The IN o
11930 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a  perator must be.
11940 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11950 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65             imple
11960 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71 75  mented as a sequ
11970 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
11980 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ons..**.** An ex
11990 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69  isting b-tree mi
119a0 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20 74  ght be used if t
119b0 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69 6f  he RHS expressio
119c0 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65  n pX is a simple
119d0 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75 63  .** subquery suc
119e0 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  h as:.**.**     
119f0 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e  SELECT <column1>
11a00 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46  , <column2>... F
11a10 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a  ROM <table>.**.*
11a20 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20  * If the RHS of 
11a30 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
11a40 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d  is a list or a m
11a50 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71  ore complex subq
11a60 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e  uery, then.** an
11a70 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
11a80 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62   might need to b
11a90 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
11aa0 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65   the RHS and the
11ab0 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20  n.** pX->iTable 
11ac0 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  made to point to
11ad0 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
11ae0 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  able instead of 
11af0 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74  an.** existing t
11b00 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
11b10 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  inFlags paramete
11b20 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 65  r must contain e
11b30 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
11b40 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44  e bits.** IN_IND
11b50 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72  EX_MEMBERSHIP or
11b60 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20   IN_INDEX_LOOP. 
11b70 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74   If inFlags cont
11b80 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  ains.** IN_INDEX
11b90 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65  _MEMBERSHIP, the
11ba0 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  n the generated 
11bb0 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73  table will be us
11bc0 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74  ed for a.** fast
11bd0 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
11be0 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49  .  When the IN_I
11bf0 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73  NDEX_LOOP bit is
11c00 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20   set, the.** IN 
11c10 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75 73  index will be us
11c20 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20  ed to loop over 
11c30 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68  all values of th
11c40 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20  e RHS of the.** 
11c50 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  IN operator..**.
11c60 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58  ** When IN_INDEX
11c70 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61  _LOOP is used (a
11c80 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  nd the b-tree wi
11c90 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ll be used to it
11ca0 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68  erate.** through
11cb0 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73   the set members
11cc0 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65  ) then the b-tre
11cd0 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61  e must not conta
11ce0 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a  in duplicates..*
11cf0 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  * An epheremal t
11d00 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65  able must be use
11d10 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c  d unless the sel
11d20 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  ected columns ar
11d30 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  e guaranteed.** 
11d40 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65  to be unique - e
11d50 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74  ither because it
11d60 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
11d70 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75  RIMARY KEY or du
11d80 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45  e to.** a UNIQUE
11d90 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69   constraint or i
11da0 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ndex..**.** When
11db0 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
11dc0 53 48 49 50 20 69 73 20 75 73 65 64 20 28 61 6e  SHIP is used (an
11dd0 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
11de0 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f  l be used .** fo
11df0 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65  r fast set membe
11e00 72 73 68 69 70 20 74 65 73 74 73 29 20 74 68 65  rship tests) the
11e10 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  n an epheremal t
11e20 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65  able must .** be
11e30 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f   used unless <co
11e40 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67  lumns> is a sing
11e50 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  le INTEGER PRIMA
11e60 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72  RY KEY column or
11e70 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61   an .** index ca
11e80 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20  n be found with 
11e90 74 68 65 20 73 70 65 63 69 66 69 65 64 20 3c 63  the specified <c
11ea0 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c  olumns> as its l
11eb0 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20  eft-most..**.** 
11ec0 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  If the IN_INDEX_
11ed0 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49  NOOP_OK and IN_I
11ee0 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
11ef0 61 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64  are both set and
11f00 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f  .** if the RHS o
11f10 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
11f20 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74  r is a list (not
11f30 20 61 20 73 75 62 71 75 65 72 79 29 20 74 68 65   a subquery) the
11f40 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
11f50 65 20 6d 69 67 68 74 20 64 65 63 69 64 65 20 74  e might decide t
11f60 68 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20  hat creating an 
11f70 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65  ephemeral b-tree
11f80 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a   for membership.
11f90 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f  ** testing is to
11fa0 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20  o expensive and 
11fb0 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f  return IN_INDEX_
11fc0 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63  NOOP.  In that c
11fd0 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ase, the.** call
11fe0 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  ing routine shou
11ff0 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  ld implement the
12000 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69   IN operator usi
12010 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ng a sequence.**
12020 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d   of Eq or Ne com
12030 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
12040 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ns..**.** When t
12050 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69  he b-tree is bei
12060 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62  ng used for memb
12070 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68  ership tests, th
12080 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
12090 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64  on.** might need
120a0 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72   to know whether
120b0 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20   or not the RHS 
120c0 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
120d0 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61  perator.** conta
120e0 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20  ins a NULL.  If 
120f0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
12100 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  not a NULL point
12110 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68  er and .** if th
12120 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63  ere is any chanc
12130 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
12140 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
12150 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a   NULL value at.*
12160 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20  * runtime, then 
12170 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
12180 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
12190 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
121a0 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70  written.** to *p
121b0 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20  rRhsHasNull. If 
121c0 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
121d0 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
121e0 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  ) contains a.** 
121f0 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e  NULL value, then
12200 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69   *prRhsHasNull i
12210 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
12220 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
12230 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
12240 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74  ed and its locat
12250 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  ion stored in *p
12260 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65  rRhsHasNull, the
12270 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
12280 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
12290 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
122a0 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
122b0 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  ins one or more.
122c0 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ** NULL values, 
122d0 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73  and it will be s
122e0 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  ome non-NULL val
122f0 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ue if the b-tree
12300 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
12310 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  NULL values..**.
12320 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61 70 20  ** If the aiMap 
12330 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
12340 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70   NULL, it must p
12350 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79  oint to an array
12360 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f   containing.** o
12370 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65  ne element for e
12380 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  ach column retur
12390 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
123a0 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74  T statement on t
123b0 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65  he RHS.** of the
123c0 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f   IN(...) operato
123d0 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e 74 72  r. The i'th entr
123e0 79 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69  y of the array i
123f0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
12400 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f   the.** offset o
12410 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75  f the index colu
12420 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  mn that matches 
12430 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20  the i'th column 
12440 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a  returned by the.
12450 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65  ** SELECT. For e
12460 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65  xample, if the e
12470 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65  xpression and se
12480 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61 72 65  lected index are
12490 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f  :.**.**   (?,?,?
124a0 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20  ) IN (SELECT a, 
124b0 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a  b, c FROM t1).**
124c0 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
124d0 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61  i1 ON t1(b, c, a
124e0 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69  );.**.** then ai
124f0 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74  Map[] is populat
12500 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31  ed with {2, 0, 1
12510 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  }..*/.#ifndef SQ
12520 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
12530 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  RY.int sqlite3Fi
12540 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72  ndInIndex(.  Par
12550 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12560 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
12570 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
12580 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20  Expr *pX,       
12590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
125a0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
125b0 65 20 28 52 48 53 29 20 6f 66 20 74 68 65 20 49  e (RHS) of the I
125c0 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
125d0 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20  u32 inFlags,    
125e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
125f0 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45  _INDEX_LOOP, _ME
12600 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72  MBERSHIP, and/or
12610 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69   _NOOP_OK */.  i
12620 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  nt *prRhsHasNull
12630 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ,         /* Reg
12640 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55  ister holding NU
12650 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65 65 20  LL status.  See 
12660 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  notes */.  int *
12670 61 69 4d 61 70 20 20 20 20 20 20 20 20 20 20 20  aiMap           
12680 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
12690 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c   from Index fiel
126a0 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73  ds to RHS fields
126b0 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
126c0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
126e0 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20  * SELECT to the 
126f0 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72  right of IN oper
12700 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54  ator */.  int eT
12710 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74  /* Type of RHS t
12740 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a  able. IN_INDEX_*
12750 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
12760 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
12780 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53  ursor of the RHS
12790 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
127a0 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20  mustBeUnique;   
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53    /* True if RHS
127d0 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20   must be unique 
127e0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
127f0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12800 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69  arse);     /* Vi
12810 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
12820 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20  ing coded */..  
12830 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
12840 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42  TK_IN );.  mustB
12850 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61  eUnique = (inFla
12860 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
12870 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66  OP)!=0;..  /* If
12880 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 69 73   the RHS of this
12890 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f   IN(...) operato
128a0 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61  r is a SELECT, a
128b0 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65 72 73  nd if it matters
128c0 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
128d0 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54  r not the SELECT
128e0 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73   result contains
128f0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68   NULL values, ch
12900 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a  eck whether.  **
12910 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20   or not NULL is 
12920 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c  actually possibl
12930 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65  e (it may not be
12940 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64  , for example, d
12950 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20  ue .  ** to NOT 
12960 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
12970 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e   in the schema).
12980 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75   If no NULL valu
12990 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c  es are possible,
129a0 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48  .  ** set prRhsH
129b0 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f  asNull to 0 befo
129c0 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  re continuing.  
129d0 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73 48 61  */.  if( prRhsHa
129e0 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c  sNull && (pX->fl
129f0 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
12a00 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ct) ){.    int i
12a10 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
12a20 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70  pEList = pX->x.p
12a30 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
12a40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
12a50 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
12a60 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
12a70 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
12a80 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ll(pEList->a[i].
12a90 70 45 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a  pExpr) ) break;.
12aa0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
12ab0 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  =pEList->nExpr )
12ac0 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48 61 73  {.      prRhsHas
12ad0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Null = 0;.    }.
12ae0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
12af0 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69  to see if an exi
12b00 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
12b10 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
12b20 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79   to.  ** satisfy
12b30 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
12b40 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20  s is preferable 
12b50 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  to generating a 
12b60 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65  new .  ** epheme
12b70 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ral table.  */. 
12b80 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
12b90 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43  r==0 && (p = isC
12ba0 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
12bb0 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  (pX))!=0 ){.    
12bc0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
12bd0 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
12be0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
12bf0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
12c00 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
12c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12c30 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f  able <table>. */
12c40 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20 20 20  .    i16 iDb;   
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
12c70 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20  atabase idx for 
12c80 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72  pTab */.    Expr
12c90 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
12ca0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e  ->pEList;.    in
12cb0 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74  t nExpr = pEList
12cc0 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73  ->nExpr;..    as
12cd0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
12ce0 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
12cf0 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
12d00 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
12d10 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73  Opt(p) */.    as
12d20 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
12d30 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
12d40 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20  ; /* Because of 
12d50 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
12d60 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73  Opt(p) */.    as
12d70 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30  sert( p->pSrc!=0
12d80 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
12d90 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
12da0 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
12db0 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54  Opt(p) */.    pT
12dc0 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
12dd0 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a  0].pTab;..    /*
12de0 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e   Code an OP_Tran
12df0 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54  saction and OP_T
12e00 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61  ableLock for <ta
12e10 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62  ble>. */.    iDb
12e20 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
12e30 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
12e40 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
12e50 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
12e60 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
12e70 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
12e80 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
12e90 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
12ea0 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
12eb0 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  me);..    assert
12ec0 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  (v);  /* sqlite3
12ed0 47 65 74 56 64 62 65 28 29 20 68 61 73 20 61 6c  GetVdbe() has al
12ee0 77 61 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f  ways been previo
12ef0 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  usly called */. 
12f00 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20     if( nExpr==1 
12f10 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  && pEList->a[0].
12f20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
12f30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
12f40 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72   "x IN (SELECT r
12f50 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29  owid FROM table)
12f60 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  " case */.      
12f70 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
12f80 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
12f90 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20   OP_Once);.     
12fa0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12fb0 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
12fc0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
12fd0 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
12fe0 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
12ff0 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
13000 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a  N_INDEX_ROWID;..
13010 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13020 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
13030 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
13040 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
13050 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
13060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
13070 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
13080 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
13090 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20  inity_ok = 1;.  
130a0 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
130b0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
130c0 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  the affinity tha
130d0 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
130e0 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20 0a  o perform each .
130f0 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69        ** compari
13100 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20  son is the same 
13110 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  as the affinity 
13120 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69  of each column i
13130 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  n table.      **
13140 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
13150 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  he IN operator. 
13160 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20 69   If it not, it i
13170 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13180 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 61  o.      ** use a
13190 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ny index of the 
131a0 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  RHS table.  */. 
131b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
131c0 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69 74  nExpr && affinit
131d0 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  y_ok; i++){.    
131e0 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d      Expr *pLhs =
131f0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
13200 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70  eldSubexpr(pX->p
13210 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
13220 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c    int iCol = pEL
13230 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d  ist->a[i].pExpr-
13240 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
13250 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d 20    char idxaff = 
13260 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75  sqlite3TableColu
13270 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62 2c  mnAffinity(pTab,
13280 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61  iCol); /* RHS ta
13290 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ble */.        c
132a0 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71 6c  har cmpaff = sql
132b0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
132c0 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66 66  ity(pLhs, idxaff
132d0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
132e0 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c  ase( cmpaff==SQL
132f0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a  ITE_AFF_BLOB );.
13300 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
13310 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45  ( cmpaff==SQLITE
13320 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
13330 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d 70       switch( cmp
13340 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  aff ){.         
13350 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
13360 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20  _BLOB:.         
13370 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13380 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
13390 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
133a0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
133b0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
133c0 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 54  ) only returns T
133d0 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65 20  EXT if one side 
133e0 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  or the.         
133f0 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73 20     ** other has 
13400 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20  no affinity and 
13410 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20 69  the other side i
13420 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a  s TEXT.  Hence,.
13430 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
13440 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20  he only way for 
13450 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45 58  cmpaff to be TEX
13460 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66 20  T is for idxaff 
13470 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20 20  to be TEXT.     
13480 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f         ** and fo
13490 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74 68  r the term on th
134a0 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
134b0 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69 6e  to have no affin
134c0 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ity. */.        
134d0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 61      assert( idxa
134e0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
134f0 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20  EXT );.         
13500 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13510 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
13520 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
13530 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73  y_ok = sqlite3Is
13540 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
13550 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20  idxaff);.       
13560 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
13570 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f    if( affinity_o
13580 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
13590 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
135a0 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  isting index tha
135b0 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20  t will work for 
135c0 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72  this IN operator
135d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
135e0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
135f0 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65  x; pIdx && eType
13600 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  ==0; pIdx=pIdx->
13610 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
13620 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65    Bitmask colUse
13630 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  d;      /* Colum
13640 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ns of the index 
13650 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  used */.        
13660 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20    Bitmask mCol; 
13670 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
13680 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
13690 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20  column */.      
136a0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
136b0 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f  olumn<nExpr ) co
136c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
136d0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f    /* Maximum nCo
136e0 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e  lumn is BMS-2, n
136f0 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61  ot BMS-1, so tha
13700 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65  t we can compute
13710 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49  .          ** BI
13720 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74  TMASK(nExpr) wit
13730 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67  hout overflowing
13740 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
13750 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43  stcase( pIdx->nC
13760 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a  olumn==BMS-2 );.
13770 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
13780 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  se( pIdx->nColum
13790 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  n==BMS-1 );.    
137a0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
137b0 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29  nColumn>=BMS-1 )
137c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
137d0 20 20 20 20 20 69 66 28 20 6d 75 73 74 42 65 55       if( mustBeU
137e0 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20  nique ){.       
137f0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
13800 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20  KeyCol>nExpr.   
13810 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64            ||(pId
13820 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72  x->nColumn>nExpr
13830 20 26 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64   && !IsUniqueInd
13840 65 78 28 70 49 64 78 29 29 0a 20 20 20 20 20 20  ex(pIdx)).      
13850 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13860 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
13870 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
13880 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76  is not unique ov
13890 65 72 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f  er the IN RHS co
138a0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  lumns */.       
138b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
138c0 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20   }.  .          
138d0 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f  colUsed = 0;   /
138e0 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64  * Columns of ind
138f0 65 78 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a  ex used so far *
13900 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
13910 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
13920 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
13930 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c  Expr *pLhs = sql
13940 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
13950 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74  ubexpr(pX->pLeft
13960 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
13970 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70    Expr *pRhs = p
13980 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
13990 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  r;.            C
139a0 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73  ollSeq *pReq = s
139b0 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
139c0 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
139d0 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a  e, pLhs, pRhs);.
139e0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
139f0 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  j;.  .          
13a00 20 20 61 73 73 65 72 74 28 20 70 52 65 71 21 3d    assert( pReq!=
13a10 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75  0 || pRhs->iColu
13a20 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20  mn==XN_ROWID || 
13a30 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
13a40 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
13a50 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b  j=0; j<nExpr; j+
13a60 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
13a70 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
13a80 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69  lumn[j]!=pRhs->i
13a90 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
13aa0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
13ab0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
13ac0 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20  zColl[j] );.    
13ad0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
13ae0 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  eq!=0 && sqlite3
13af0 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e  StrICmp(pReq->zN
13b00 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ame, pIdx->azCol
13b10 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20  l[j])!=0 ){.    
13b20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
13b30 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
13b40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13b50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13b60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13b70 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70       if( j==nExp
13b80 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
13b90 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41         mCol = MA
13ba0 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20  SKBIT(j);.      
13bb0 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26        if( mCol &
13bc0 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b   colUsed ) break
13bd0 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e  ; /* Each column
13be0 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20   used only once 
13bf0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  */.            c
13c00 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a  olUsed |= mCol;.
13c10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
13c20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d  aiMap ) aiMap[i]
13c30 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
13c40 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 61  }.  .          a
13c50 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20  ssert( i==nExpr 
13c60 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53  || colUsed!=(MAS
13c70 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29  KBIT(nExpr)-1) )
13c80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
13c90 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49  colUsed==(MASKBI
13ca0 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20  T(nExpr)-1) ){. 
13cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
13cc0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
13cd0 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
13ce0 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 20   the index pIdx 
13cf0 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20  is usable */.   
13d00 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64           int iAd
13d10 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13d20 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
13d30 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
13d40 28 76 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (v);.#ifndef SQL
13d50 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
13d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
13d70 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
13d80 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30 2c  , OP_Explain, 0,
13d90 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
13da0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
13db0 6e 74 66 28 64 62 2c 20 22 55 53 49 4e 47 20 49  ntf(db, "USING I
13dc0 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f  NDEX %s FOR IN-O
13dd0 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a  PERATOR",pIdx->z
13de0 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
13df0 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29       P4_DYNAMIC)
13e00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
13e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13e20 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
13e30 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64  nRead, iTab, pId
13e40 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
13e50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13e60 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
13e70 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
13e80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
13e90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
13ea0 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
13eb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
13ec0 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f  ssert( IN_INDEX_
13ed0 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e  INDEX_DESC == IN
13ee0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
13ef0 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
13f00 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
13f10 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70  EX_INDEX_ASC + p
13f20 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
13f30 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  0];.  .         
13f40 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e     if( prRhsHasN
13f50 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ull ){.#ifdef SQ
13f60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
13f70 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20  MN_USED_MASK.   
13f80 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d             i64 m
13f90 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29  ask = (1<<nExpr)
13fa0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
13fb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13fc0 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
13fd0 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20  lumnsUsed, .    
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54                iT
13ff0 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26  ab, 0, 0, (u8*)&
14000 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b  mask, P4_INT64);
14010 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
14020 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e        *prRhsHasN
14030 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
14040 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
14050 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31      if( nExpr==1
14060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14070 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
14080 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61  sNullFlag(v, iTa
14090 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  b, *prRhsHasNull
140a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
140b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
140c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
140d0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
140e0 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
140f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14100 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76  } /* End loop ov
14110 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  er indexes */.  
14120 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28      } /* End if(
14130 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a   affinity_ok ) *
14140 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69  /.    } /* End i
14150 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69  f not an rowid i
14160 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45  ndex */.  } /* E
14170 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70  nd attempt to op
14180 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20  timize using an 
14190 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49  index */..  /* I
141a0 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67  f no preexisting
141b0 20 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61   index is availa
141c0 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63  ble for the IN c
141d0 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49  lause.  ** and I
141e0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
141f0 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79  an allowed reply
14200 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
14210 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
14220 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20  ator is a list, 
14230 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20  not a subquery. 
14240 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
14250 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
14260 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65  or has two or fe
14270 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20  wer terms,.  ** 
14280 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77  then it is not w
14290 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e  orth creating an
142a0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
142b0 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a   to evaluate.  *
142c0 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  * the IN operato
142d0 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49  r so return IN_I
142e0 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a  NDEX_NOOP..  */.
142f0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20    if( eType==0. 
14300 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20    && (inFlags & 
14310 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
14320 29 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73  ).   && !ExprHas
14330 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
14340 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26  xIsSelect).   &&
14350 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49   (!sqlite3InRhsI
14360 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c  sConstant(pX) ||
14370 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pX->x.pList->nE
14380 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20  xpr<=2).  ){.   
14390 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
143a0 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  X_NOOP;.  }..  i
143b0 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( eType==0 ){. 
143c0 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20     /* Could not 
143d0 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67  find an existing
143e0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
143f0 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48  to use as the RH
14400 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a  S b-tree..    **
14410 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f   We will have to
14420 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68   generate an eph
14430 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
14440 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20  do the job..    
14450 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64  */.    u32 saved
14460 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
14470 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
14480 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76  .    int rMayHav
14490 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65  eNull = 0;.    e
144a0 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
144b0 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46  EPH;.    if( inF
144c0 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
144d0 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50  LOOP ){.      pP
144e0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
144f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
14500 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  pX->pLeft->iColu
14510 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73  mn<0 && !ExprHas
14520 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
14530 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
14540 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
14550 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20  _INDEX_ROWID;.  
14560 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
14570 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
14580 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73   ){.      *prRhs
14590 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61  HasNull = rMayHa
145a0 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  veNull = ++pPars
145b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20  e->nMem;.    }. 
145c0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
145d0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
145e0 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  pX, rMayHaveNull
145f0 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  , eType==IN_INDE
14600 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50  X_ROWID);.    pP
14610 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
14620 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f   = savedNQueryLo
14630 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  op;.  }else{.   
14640 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pX->iTable = iT
14650 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61  ab;.  }..  if( a
14660 69 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d 49  iMap && eType!=I
14670 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
14680 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49  C && eType!=IN_I
14690 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
146a0 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b  ){.    int i, n;
146b0 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
146c0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
146d0 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66  X->pLeft);.    f
146e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
146f0 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a  ) aiMap[i] = i;.
14700 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79    }.  return eTy
14710 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  pe;.}.#endif..#i
14720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14730 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
14740 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20   Argument pExpr 
14750 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20  is an (?, ?...) 
14760 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
14770 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  on. This .** fun
14780 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
14790 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75  and returns a nu
147a0 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
147b0 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a  ing containing .
147c0 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  ** the affinitie
147d0 73 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  s to be used for
147e0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   each column of 
147f0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a  the comparison..
14800 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  **.** It is the 
14810 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
14820 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
14830 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
14840 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69  returned.** stri
14850 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  ng is eventually
14860 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c   freed using sql
14870 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f  ite3DbFree()..*/
14880 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78  .static char *ex
14890 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72  prINAffinity(Par
148a0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
148b0 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72   *pExpr){.  Expr
148c0 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
148d0 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56  >pLeft;.  int nV
148e0 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
148f0 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
14900 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  );.  Select *pSe
14910 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66  lect = (pExpr->f
14920 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
14930 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e  ect) ? pExpr->x.
14940 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63  pSelect : 0;.  c
14950 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73  har *zRet;..  as
14960 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
14970 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74  =TK_IN );.  zRet
14980 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
14990 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62  ocRaw(pParse->db
149a0 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28  , nVal+1);.  if(
149b0 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   zRet ){.    int
149c0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
149d0 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
149e0 20 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20       Expr *pA = 
149f0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
14a00 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
14a10 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20   i);.      char 
14a20 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  a = sqlite3ExprA
14a30 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20  ffinity(pA);.   
14a40 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
14a50 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69  {.        zRet[i
14a60 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  ] = sqlite3Compa
14a70 72 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65  reAffinity(pSele
14a80 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
14a90 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20  .pExpr, a);.    
14aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14ab0 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20   zRet[i] = a;.  
14ac0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14ad0 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30  zRet[nVal] = '\0
14ae0 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ';.  }.  return 
14af0 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
14b00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14b10 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
14b20 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73  ** Load the Pars
14b30 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
14b40 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
14b50 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72  ument with an er
14b60 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20  ror .** message 
14b70 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
14b80 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74  **   "sub-select
14b90 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d   returns N colum
14ba0 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22  ns - expected M"
14bb0 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69  .*/   .void sqli
14bc0 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
14bd0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
14be0 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e   int nActual, in
14bf0 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f  t nExpect){.  co
14c00 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d  nst char *zFmt =
14c10 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74   "sub-select ret
14c20 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20  urns %d columns 
14c30 2d 20 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a  - expected %d";.
14c40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14c50 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20  g(pParse, zFmt, 
14c60 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74  nActual, nExpect
14c70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
14c80 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45  ** Expression pE
14c90 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 20  xpr is a vector 
14ca0 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 75 73  that has been us
14cb0 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20  ed in a context 
14cc0 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e  where.** it is n
14cd0 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66  ot permitted. If
14ce0 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d   pExpr is a sub-
14cf0 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74  select vector, t
14d00 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20  his routine .** 
14d10 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73 65 20  loads the Parse 
14d20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65  object with a me
14d30 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72  ssage of the for
14d40 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d  m:.**.**   "sub-
14d50 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e  select returns N
14d60 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
14d70 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ted 1".**.** Or,
14d80 20 69 66 20 69 74 20 69 73 20 61 20 72 65 67 75   if it is a regu
14d90 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f  lar scalar vecto
14da0 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20  r:.**.**   "row 
14db0 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a  value misused".*
14dc0 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
14dd0 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
14de0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
14df0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66  xpr *pExpr){.#if
14e00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14e10 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
14e20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
14e30 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20  P_xIsSelect ){. 
14e40 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
14e50 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
14e60 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
14e70 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
14e80 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  , 1);.  }else.#e
14e90 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
14ea0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14eb0 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
14ec0 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d  misused");.  }.}
14ed0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
14ee0 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72   code for scalar
14ef0 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64   subqueries used
14f00 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65   as a subquery e
14f10 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54  xpression, EXIST
14f20 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72  S,.** or IN oper
14f30 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73  ators.  Examples
14f40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
14f50 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
14f60 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
14f70 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
14f80 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
14f90 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
14fa0 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78  ubquery.**     x
14fb0 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20   IN (4,5,11)    
14fc0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20            -- IN 
14fd0 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69  operator with li
14fe0 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  st on right-hand
14ff0 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49   side.**     x I
15000 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  N (SELECT a FROM
15010 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70   b)     -- IN op
15020 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71  erator with subq
15030 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68  uery on the righ
15040 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70  t.**.** The pExp
15050 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63  r parameter desc
15060 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73  ribes the expres
15070 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
15080 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65  ns the IN.** ope
15090 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72  rator or subquer
150a0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
150b0 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73  meter isRowid is
150c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
150d0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
150e0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
150f0 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66  * to be of the f
15100 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20  orm "<rowid> IN 
15110 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72  (?, ?, ?)", wher
15120 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72  e <rowid> is a r
15130 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73  eference.** to s
15140 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  ome integer key 
15150 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
15160 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69  e B-Tree. In thi
15170 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a  s case, use an.*
15180 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20  * intkey B-Tree 
15190 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
151a0 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75   of IN(...) valu
151b0 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  es instead of th
151c0 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77  e usual.** (slow
151d0 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  er) variable len
151e0 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e  gth keys B-Tree.
151f0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61  .**.** If rMayHa
15200 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65  veNull is non-ze
15210 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ro, that means t
15220 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  hat the operatio
15230 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e  n is an IN.** (n
15240 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  ot a SELECT or E
15250 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20  XISTS) and that 
15260 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f  the RHS might co
15270 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a  ntains NULLs..**
15280 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
15290 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61  e does is initia
152a0 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65  lize the registe
152b0 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48  r given by rMayH
152c0 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55  aveNull.** to NU
152d0 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75  LL.  Calling rou
152e0 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20  tines will take 
152f0 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67  care of changing
15300 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a   this register.*
15310 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e  * value to non-N
15320 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69  ULL if the RHS i
15330 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a  s NULL-free..**.
15340 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20  ** For a SELECT 
15350 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
15360 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72  or, return the r
15370 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c  egister that hol
15380 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  ds the.** result
15390 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63  .  For a multi-c
153a0 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68  olumn SELECT, th
153b0 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
153c0 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f  ed in a contiguo
153d0 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72  us.** array of r
153e0 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
153f0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
15400 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66   the register of
15410 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
15420 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e  * result column.
15430 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49    Return 0 for I
15440 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69  N operators or i
15450 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
15460 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  s..*/.#ifndef SQ
15470 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15480 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  RY.int sqlite3Co
15490 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50  deSubselect(.  P
154a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
154b0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
154c0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
154d0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
154e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
154f0 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49  , SELECT, or EXI
15500 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  STS operator */.
15510 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c    int rHasNullFl
15520 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ag,       /* Reg
15530 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72  ister that recor
15540 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73  ds whether NULLs
15550 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f   exist in RHS */
15560 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20  .  int isRowid  
15570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
15580 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e   true, LHS of IN
15590 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72   operator is a r
155a0 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  owid */.){.  int
155b0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
155c0 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
155d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d           /* One-
155e0 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73  time test addres
155f0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20  s */.  int rReg 
15600 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15620 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69  * Register stori
15630 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a  ng resulting */.
15640 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
15650 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
15660 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  e);.  if( NEVER(
15670 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  v==0) ) return 0
15680 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
15690 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
156a0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c  ;..  /* The eval
156b0 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  uation of the IN
156c0 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d  /EXISTS/SELECT m
156d0 75 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20  ust be repeated 
156e0 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20  every time it.  
156f0 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
15700 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  d if any of the 
15710 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
15720 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
15730 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
15740 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72  d side is a corr
15750 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a  elated subquery.
15760 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
15770 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
15780 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
15790 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
157a0 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20  variables.  **  
157b0 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69    *  We are insi
157c0 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a  de a trigger.  *
157d0 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  *.  ** If all of
157e0 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66   the above are f
157f0 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61  alse, then we ca
15800 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  n run this code 
15810 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73  just once.  ** s
15820 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c  ave the results,
15830 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73   and reuse the s
15840 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75  ame result on su
15850 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
15860 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
15870 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
15880 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
15890 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d  elect) ){.    jm
158a0 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c  pIfDynamic = sql
158b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
158c0 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
158d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
158e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
158f0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
15900 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
15910 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68  ain==2 ){.    ch
15920 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
15930 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
15940 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20 25  ->db, "EXECUTE %
15950 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  s%s SUBQUERY %d"
15960 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44  ,.        jmpIfD
15970 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f  ynamic>=0?"":"CO
15980 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20  RRELATED ",.    
15990 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
159a0 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41  K_IN?"LIST":"SCA
159b0 4c 41 52 22 2c 0a 20 20 20 20 20 20 20 20 70 50  LAR",.        pP
159c0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
159d0 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tId.    );.    s
159e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
159f0 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
15a00 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
15a10 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
15a20 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
15a30 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68  #endif..  switch
15a40 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
15a50 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
15a60 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a80 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
15a90 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
15aa0 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
15ab0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
15ac0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
15ad0 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66  t; /* the LHS of
15ae0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
15af0 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   */.      KeyInf
15b00 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
15b10 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66        /* Key inf
15b20 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
15b30 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20    int nVal;     
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15b50 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20   Size of vector 
15b60 70 4c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a  pLeft */.      .
15b70 20 20 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c        nVal = sql
15b80 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
15b90 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  ze(pLeft);.     
15ba0 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69   assert( !isRowi
15bb0 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a  d || nVal==1 );.
15bc0 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
15bd0 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20  r this is an 'x 
15be0 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f  IN(SELECT...)' o
15bf0 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72  r an 'x IN(<expr
15c00 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a  list>)'.      **
15c10 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69   expression it i
15c20 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61  s handled the sa
15c30 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65  me way.  An ephe
15c40 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a  meral table is .
15c50 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
15c60 77 69 74 68 20 69 6e 64 65 78 20 6b 65 79 73 20  with index keys 
15c70 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
15c80 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
15c90 65 20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  e .      ** SELE
15ca0 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
15cb0 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
15cc0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
15cd0 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
15ce0 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
15cf0 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
15d00 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
15d10 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
15d20 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
15d30 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
15d40 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
15d50 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
15d60 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
15d70 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
15d80 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
15d90 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
15da0 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
15db0 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
15dc0 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
15dd0 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
15de0 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
15df0 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
15e00 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
15e10 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
15e20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
15e30 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
15e40 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
15e50 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
15e60 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
15e70 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
15e80 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
15e90 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
15ea0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
15eb0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
15ec0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
15ed0 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20  Ephemeral, .    
15ee0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
15ef0 62 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a  ble, (isRowid?0:
15f00 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b  nVal));.      pK
15f10 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64  eyInfo = isRowid
15f20 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65   ? 0 : sqlite3Ke
15f30 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
15f40 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b  e->db, nVal, 1);
15f50 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ..      if( Expr
15f60 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15f70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
15f80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
15f90 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
15fa0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
15fb0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
15fc0 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
15fd0 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
15fe0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
15ff0 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
16000 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
16010 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
16020 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
16030 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
16040 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
16050 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70   *pSelect = pExp
16060 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
16070 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
16080 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
16090 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20  ->pEList;..     
160a0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f     assert( !isRo
160b0 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  wid );.        /
160c0 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64  * If the LHS and
160d0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
160e0 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d  perator do not m
160f0 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20 20 20  atch, that.     
16100 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c     ** error will
16110 20 68 61 76 65 20 62 65 65 6e 20 63 61 75 67 68   have been caugh
16120 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65  t long before we
16130 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
16140 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  t. */.        if
16150 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74 2d  ( ALWAYS(pEList-
16160 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b  >nExpr==nVal) ){
16170 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
16180 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
16190 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
161a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
161b0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
161c0 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78  st, SRT_Set, pEx
161d0 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
161e0 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66         dest.zAff
161f0 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66  Sdst = exprINAff
16200 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45  inity(pParse, pE
16210 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
16220 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
16230 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 0;.          t
16240 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74  estcase( pSelect
16250 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
16260 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
16270 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16280 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f  pKeyInfo==0 ); /
16290 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20  * Caused by OOM 
162a0 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  in sqlite3KeyInf
162b0 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20  oAlloc() */.    
162c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
162d0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
162e0 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
162f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
16300 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
16310 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
16320 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
16330 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
16340 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
16350 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
16360 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
16370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16380 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
16390 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
163a0 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
163b0 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
163c0 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
163d0 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
163e0 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
163f0 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
16400 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
16410 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
16420 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
16430 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
16440 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16450 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
16460 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
16470 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
16480 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
16490 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
164a0 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73       Expr *p = s
164b0 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
164c0 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
164d0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
164e0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
164f0 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  i] = sqlite3Bina
16500 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
16510 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
16520 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c    pParse, p, pEL
16530 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a  ist->a[i].pExpr.
16540 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
16550 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16560 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16570 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
16580 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29  r->x.pList!=0) )
16590 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
165a0 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
165b0 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
165c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
165d0 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
165e0 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
165f0 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
16600 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
16610 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
16620 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
16630 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
16640 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
16650 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
16660 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
16670 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
16680 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
16690 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
166a0 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
166b0 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
166c0 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
166d0 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
166e0 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
166f0 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
16700 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66    /* Affinity of
16710 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
16720 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  IN */.        in
16730 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
16740 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
16750 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
16760 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
16770 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
16780 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  em;.        int 
16790 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20  r1, r2, r3;..   
167a0 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
167b0 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
167c0 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ity(pLeft);.    
167d0 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
167e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
167f0 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
16800 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20  _AFF_BLOB;.     
16810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
16820 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
16830 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
16840 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
16850 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
16860 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o) );.          
16870 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
16880 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  0] = sqlite3Expr
16890 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
168a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
168b0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
168c0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
168d0 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
168e0 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
168f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d   */.        r1 =
16900 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16910 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
16920 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
16930 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
16940 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
16950 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65  isRowid ) sqlite
16960 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16970 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a  P_Null, 0, r2);.
16980 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
16990 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
169a0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
169b0 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
169c0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
169d0 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
169e0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  pr;.          in
169f0 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20  t iValToIns;..  
16a00 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
16a10 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
16a20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
16a30 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
16a40 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
16a50 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
16a60 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
16a70 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
16a80 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
16a90 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
16aa0 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
16ab0 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
16ac0 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
16ad0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
16ae0 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
16af0 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
16b00 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
16b10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16b20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79       if( jmpIfDy
16b30 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c  namic>=0 && !sql
16b40 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
16b50 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
16b60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16b70 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
16b80 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b  , jmpIfDynamic);
16b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70  .            jmp
16ba0 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a  IfDynamic = -1;.
16bb0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
16bc0 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61         /* Evalua
16bd0 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
16be0 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  n and insert it 
16bf0 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
16c00 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ble */.         
16c10 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20   if( isRowid && 
16c20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
16c30 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54  eger(pE2, &iValT
16c40 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20  oIns) ){.       
16c50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16c60 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
16c70 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69  ertInt, pExpr->i
16c80 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54  Table, r2, iValT
16c90 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20  oIns);.         
16ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16cb0 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
16cc0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
16cd0 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b  Parse, pE2, r1);
16ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
16cf0 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20   isRowid ){.    
16d00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16d10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16d20 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c  P_MustBeInt, r3,
16d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d50 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
16d60 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
16d80 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16d90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16da0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16db0 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70   OP_Insert, pExp
16dc0 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
16dd0 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
16de0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16df0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16e00 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
16e10 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20  eRecord, r3, 1, 
16e20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
16e30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
16e40 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
16e50 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
16e60 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
16e80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
16e90 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
16ea0 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
16eb0 65 2c 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20  e, r2, r3, 1);. 
16ec0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
16ed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16ee0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
16ef0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16f00 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
16f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
16f20 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
16f30 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
16f40 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
16f50 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nfo ){.        s
16f60 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16f70 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P4(v, addr, (voi
16f80 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  d *)pKeyInfo, P4
16f90 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
16fa0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
16fb0 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
16fc0 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
16fd0 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
16fe0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
16ff0 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20      /* Case 3:  
17000 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52    (SELECT ... FR
17010 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a  OM ...).      **
17020 20 20 20 20 20 6f 72 3a 20 20 20 20 45 58 49 53       or:    EXIS
17030 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  TS(SELECT ... FR
17040 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a  OM ...).      **
17050 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
17060 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65  SELECT, generate
17070 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
17080 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20   values for all 
17090 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20  columns of.     
170a0 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 6f   ** the first ro
170b0 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  w into an array 
170c0 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  of registers and
170d0 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   return the inde
170e0 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  x of.      ** th
170f0 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
17100 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
17110 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
17120 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 20  n EXISTS, write 
17130 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f  an integer 0 (no
17140 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28  t exists) or 1 (
17150 65 78 69 73 74 73 29 0a 20 20 20 20 20 20 2a 2a  exists).      **
17160 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
17170 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
17180 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
17190 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
171a0 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65   ** In both case
171b0 73 2c 20 74 68 65 20 71 75 65 72 79 20 69 73 20  s, the query is 
171c0 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 22  augmented with "
171d0 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79 20 0a  LIMIT 1".  Any .
171e0 20 20 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73        ** preexis
171f0 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 64 69  ting limit is di
17200 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61 63 65  scarded in place
17210 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49 4d 49   of the new LIMI
17220 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  T 1..      */.  
17230 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
17240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
17260 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
17270 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   encode */.     
17280 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
17290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
172a0 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
172b0 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43   deal with SELEC
172c0 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  T result */.    
172d0 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
17300 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
17310 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63   */..      testc
17320 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
17330 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
17340 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
17350 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
17360 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
17370 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
17380 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72  _EXISTS || pExpr
17390 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
173a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
173b0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
173c0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
173d0 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20 20 20  lect) );..      
173e0 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e  pSel = pExpr->x.
173f0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 6e  pSelect;.      n
17400 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d  Reg = pExpr->op=
17410 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53 65  =TK_SELECT ? pSe
17420 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l->pEList->nExpr
17430 20 3a 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   : 1;.      sqli
17440 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
17450 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61 72  t(&dest, 0, pPar
17460 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20  se->nMem+1);.   
17470 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
17480 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 69  += nReg;.      i
17490 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
174a0 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
174b0 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
174c0 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20  SRT_Mem;.       
174d0 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65   dest.iSdst = de
174e0 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
174f0 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d      dest.nSdst =
17500 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 20 20 73   nReg;.        s
17510 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17520 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
17530 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65  dest.iSDParm, de
17540 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d  st.iSDParm+nReg-
17550 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
17560 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
17570 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
17580 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t"));.      }els
17590 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  e{.        dest.
175a0 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73  eDest = SRT_Exis
175b0 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
175c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
175d0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
175e0 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
175f0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
17600 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49  nt((v, "Init EXI
17610 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  STS result"));. 
17620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
17630 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
17640 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d  Parse->db, pSel-
17650 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
17660 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pSel->pLimit = s
17670 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
17680 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49  pParse->db, TK_I
17690 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20  NTEGER,.        
176a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176b0 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69 74            &sqlit
176c0 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20  e3IntTokens[1], 
176d0 30 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  0);.      pSel->
176e0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
176f0 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73    pSel->selFlags
17700 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c   &= ~SF_MultiVal
17710 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ue;.      if( sq
17720 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
17730 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
17740 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
17750 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
17760 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e      rReg = dest.
17770 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45  iSDParm;.      E
17780 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
17790 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
177a0 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65  duce);.      bre
177b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
177c0 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61   if( rHasNullFla
177d0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
177e0 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
177f0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17800 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a   rHasNullFlag);.
17810 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66    }..  if( jmpIf
17820 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20  Dynamic>=0 ){.  
17830 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
17840 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79  pHere(v, jmpIfDy
17850 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71  namic);.  }.  sq
17860 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
17870 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65  p(pParse);..  re
17880 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
17890 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
178a0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
178b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
178c0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
178d0 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61  ** Expr pIn is a
178e0 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73  n IN(...) expres
178f0 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  sion. This funct
17900 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20  ion checks that 
17910 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65  the .** sub-sele
17920 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ct on the RHS of
17930 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74   the IN() operat
17940 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  or has the same 
17950 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f  number of .** co
17960 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63  lumns as the vec
17970 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
17980 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f  Or, if the RHS o
17990 66 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f  f the IN() is no
179a0 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72  t .** a sub-quer
179b0 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20  y, that the LHS 
179c0 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73  is a vector of s
179d0 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ize 1..*/.int sq
179e0 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e  lite3ExprCheckIN
179f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17a00 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e  Expr *pIn){.  in
17a10 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69  t nVector = sqli
17a20 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
17a30 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20  e(pIn->pLeft);. 
17a40 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73   if( (pIn->flags
17a50 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
17a60 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63   ){.    if( nVec
17a70 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c  tor!=pIn->x.pSel
17a80 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
17a90 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  pr ){.      sqli
17aa0 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
17ab0 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78  r(pParse, pIn->x
17ac0 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
17ad0 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72  ->nExpr, nVector
17ae0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17af0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
17b00 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20   if( nVector!=1 
17b10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65  ){.    sqlite3Ve
17b20 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61  ctorErrorMsg(pPa
17b30 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29  rse, pIn->pLeft)
17b40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
17b50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
17b60 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
17b70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
17b80 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
17b90 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
17ba0 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
17bb0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
17bc0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
17bd0 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
17be0 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
17bf0 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
17c00 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
17c10 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63   a scalar or vec
17c20 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  tor expression. 
17c30 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   The .** right-h
17c40 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 69  and side (RHS) i
17c50 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65  s an array of ze
17c60 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61  ro or more scala
17c70 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a  r values, or a.*
17c80 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49 66 20  * subquery.  If 
17c90 74 68 65 20 52 48 53 20 69 73 20 61 20 73 75 62  the RHS is a sub
17ca0 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65  query, the numbe
17cb0 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
17cc0 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63  mns must.** matc
17cd0 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
17ce0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76  columns in the v
17cf0 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ector on the LHS
17d00 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
17d10 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61  .** a list of va
17d20 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75  lues, the LHS mu
17d30 73 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20  st be a scalar. 
17d40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70  .**.** The IN op
17d50 65 72 61 74 6f 72 20 69 73 20 74 72 75 65 20 69  erator is true i
17d60 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20  f the LHS value 
17d70 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  is contained wit
17d80 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20  hin the RHS..** 
17d90 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61  The result is fa
17da0 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
17db0 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74  s definitely not
17dc0 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68   in the RHS.  Th
17dd0 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  e .** result is 
17de0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73  NULL if the pres
17df0 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20  ence of the LHS 
17e00 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f  in the RHS canno
17e10 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69  t be .** determi
17e20 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  ned due to NULLs
17e30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
17e40 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
17e50 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74  ode that jumps t
17e60 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66  o destIfFalse if
17e70 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
17e80 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
17e90 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49  thin the RHS.  I
17ea0 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77  f due to NULLs w
17eb0 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
17ec0 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a  ne if the LHS.**
17ed0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
17ee0 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75   the RHS then ju
17ef0 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c  mp to destIfNull
17f00 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  .  If the LHS is
17f10 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69   contained.** wi
17f20 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  thin the RHS the
17f30 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  n fall through..
17f40 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65  **.** See the se
17f50 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74  parate in-operat
17f60 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74  or.md documentat
17f70 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ion file in the 
17f80 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c  canonical.** SQL
17f90 69 74 65 20 73 6f 75 72 63 65 20 74 72 65 65 20  ite source tree 
17fa0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
17fb0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
17fc0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
17fd0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
17fe0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
17ff0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18000 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
18010 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
18020 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
18030 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
18040 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
18050 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
18060 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
18070 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
18080 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
18090 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
180a0 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
180b0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
180c0 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
180d0 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
180e0 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
180f0 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
18100 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
18110 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
18120 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
18130 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
18140 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
18150 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
18160 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
18170 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20  t rLhs;         
18180 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28      /* Register(
18190 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c  s) holding the L
181a0 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  HS values */.  i
181b0 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20  nt rLhsOrig;    
181c0 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75       /* LHS valu
181d0 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72  es prior to reor
181e0 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b  dering by aiMap[
181f0 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ] */.  Vdbe *v; 
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18210 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
18220 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
18230 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30    int *aiMap = 0
18240 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66  ;       /* Map f
18250 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64  rom vector field
18260 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   to index column
18270 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
18280 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41   = 0;       /* A
18290 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66  ffinity string f
182a0 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a  or comparisons *
182b0 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b  /.  int nVector;
182c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
182d0 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72  e of vectors for
182e0 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
182f0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d  r */.  int iDumm
18300 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
18310 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20  Dummy parameter 
18320 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  to exprCodeVecto
18330 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  r() */.  Expr *p
18340 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Left;          /
18350 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * The LHS of the
18360 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
18370 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
18380 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20          /* loop 
18390 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
183a0 20 64 65 73 74 53 74 65 70 32 3b 20 20 20 20 20   destStep2;     
183b0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
183c0 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73  ump when NULLs s
183d0 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f  een in step 2 */
183e0 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 36  .  int destStep6
183f0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72   = 0;    /* Star
18400 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74  t of code for St
18410 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ep 6 */.  int ad
18420 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20  drTruthOp;      
18430 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70  /* Address of op
18440 63 6f 64 65 20 74 68 61 74 20 64 65 74 65 72 6d  code that determ
18450 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20 74  ines the IN is t
18460 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  rue */.  int des
18470 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f  tNotNull;      /
18480 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61  * Jump here if a
18490 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
184a0 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65 70 20  ot true in step 
184b0 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  6 */.  int addrT
184c0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
184d0 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d  Top of the step-
184e0 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c  6 loop */ ..  pL
184f0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
18500 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ft;.  if( sqlite
18510 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61  3ExprCheckIN(pPa
18520 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65  rse, pExpr) ) re
18530 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65  turn;.  zAff = e
18540 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
18550 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
18560 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
18570 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
18580 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
18590 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73   aiMap = (int*)s
185a0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
185b0 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  ro(.      pParse
185c0 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73  ->db, nVector*(s
185d0 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a  izeof(int) + siz
185e0 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20  eof(char)) + 1. 
185f0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
18600 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
18610 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65  ed ) goto sqlite
18620 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f  3ExprCodeIN_oom_
18630 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74  error;..  /* Att
18640 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20  empt to compute 
18650 74 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74  the RHS. After t
18660 68 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79  his step, if any
18670 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
18680 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e  .  ** IN_INDEX_N
18690 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c  OOP is returned,
186a0 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65   the table opene
186b0 64 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78  d ith cursor pEx
186c0 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a  pr->iTable .  **
186d0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
186e0 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
186f0 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
18700 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
18710 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
18720 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
18730 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
18740 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
18750 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
18760 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
18770 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
18780 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
18790 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
187a0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
187b0 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
187c0 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
187d0 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
187e0 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
187f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18800 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
18810 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
18820 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
18830 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
18850 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
18860 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
18870 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70  hsHasNull, aiMap
18880 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
18890 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56  arse->nErr || nV
188a0 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70  ector==1 || eTyp
188b0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a  e==IN_INDEX_EPH.
188c0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
188d0 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
188e0 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e  ASC || eType==IN
188f0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
18900 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53  C .  );.#ifdef S
18910 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
18920 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69   Confirm that ai
18930 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  Map[] contains n
18940 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76  Vector integer v
18950 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30 20  alues between 0 
18960 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72  and.  ** nVector
18970 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  -1. */.  for(i=0
18980 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
18990 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e  ){.    int j, cn
189a0 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a  t;.    for(cnt=j
189b0 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a  =0; j<nVector; j
189c0 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d  ++) if( aiMap[j]
189d0 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20  ==i ) cnt++;.   
189e0 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20   assert( cnt==1 
189f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
18a00 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53   /* Code the LHS
18a10 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  , the <expr> fro
18a20 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
18a30 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20  .)". If the LHS 
18a40 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f  is a .  ** vecto
18a50 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73 74  r, then it is st
18a60 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79  ored in an array
18a70 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69   of nVector regi
18a80 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a  sters starting .
18a90 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a    ** at r1..  **
18aa0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  .  ** sqlite3Fin
18ab0 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74  dInIndex() might
18ac0 20 68 61 76 65 20 72 65 6f 72 64 65 72 65 64 20   have reordered 
18ad0 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  the fields of th
18ae0 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a  e LHS vector.  *
18af0 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 69  * so that the fi
18b00 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  elds are in the 
18b10 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e  same order as an
18b20 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e   existing index.
18b30 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61     The.  ** aiMa
18b40 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  p[] array contai
18b50 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f  ns a mapping fro
18b60 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c  m the original L
18b70 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74  HS field order t
18b80 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64  o.  ** the field
18b90 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61 74 63   order that matc
18ba0 68 65 73 20 74 68 65 20 52 48 53 20 69 6e 64 65  hes the RHS inde
18bb0 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
18bc0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
18bd0 50 61 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72  Parse);.  rLhsOr
18be0 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63  ig = exprCodeVec
18bf0 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  tor(pParse, pLef
18c00 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66  t, &iDummy);.  f
18c10 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
18c20 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69  r && aiMap[i]==i
18c30 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20  ; i++){} /* Are 
18c40 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64  LHS fields reord
18c50 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69  ered? */.  if( i
18c60 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20  ==nVector ){.   
18c70 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61   /* LHS fields a
18c80 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64  re not reordered
18c90 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72   */.    rLhs = r
18ca0 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65  LhsOrig;.  }else
18cb0 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
18cc0 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53   reorder the LHS
18cd0 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e   fields accordin
18ce0 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20  g to aiMap */.  
18cf0 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33    rLhs = sqlite3
18d00 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
18d10 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  rse, nVector);. 
18d20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
18d30 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
18d40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18d50 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
18d60 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68   rLhsOrig+i, rLh
18d70 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a  s+aiMap[i], 0);.
18d80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18d90 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  If sqlite3FindIn
18da0 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20  Index() did not 
18db0 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
18dc0 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  n index that is.
18dd0 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f    ** suitable fo
18de0 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  r evaluating the
18df0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68   IN operator, th
18e00 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e  en evaluate usin
18e10 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  g a.  ** sequenc
18e20 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73  e of comparisons
18e30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
18e40 20 69 73 20 73 74 65 70 20 28 31 29 20 69 6e 20   is step (1) in 
18e50 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e  the in-operator.
18e60 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67  md optimized alg
18e70 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69  orithm..  */.  i
18e80 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
18e90 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45  EX_NOOP ){.    E
18ea0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
18eb0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
18ec0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
18ed0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
18ee0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
18ef0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
18f00 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20      int labelOk 
18f10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18f20 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
18f30 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65  nt r2, regToFree
18f40 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e  ;.    int regCkN
18f50 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ull = 0;.    int
18f60 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28   ii;.    assert(
18f70 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
18f80 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
18f90 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
18fa0 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  ( destIfNull!=de
18fb0 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
18fc0 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73     regCkNull = s
18fd0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
18fe0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18ff0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19000 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
19010 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43  rLhs, rLhs, regC
19020 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  kNull);.    }.  
19030 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
19040 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  List->nExpr; ii+
19050 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  +){.      r2 = s
19060 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
19070 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  mp(pParse, pList
19080 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26  ->a[ii].pExpr, &
19090 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  regToFree);.    
190a0 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
190b0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
190c0 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61  nBeNull(pList->a
190d0 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
190e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
190f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
19100 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c  itAnd, regCkNull
19110 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r2, regCkNull)
19120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19130 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  if( ii<pList->nE
19140 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e  xpr-1 || destIfN
19150 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
19160 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19170 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19180 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61   OP_Eq, rLhs, la
19190 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20  belOk, r2,.     
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191b0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
191c0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
191d0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
191e0 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69  rageIf(v, ii<pLi
191f0 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
19200 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
19210 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73  geIf(v, ii==pLis
19220 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
19230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19240 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
19250 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
19260 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
19270 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  t( destIfNull==d
19280 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20  estIfFalse );.  
19290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
192a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
192b0 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61  , rLhs, destIfFa
192c0 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192e0 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
192f0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
19300 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19310 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19320 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
19330 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a  ff[0] | SQLITE_J
19340 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
19350 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
19360 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19370 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
19380 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
19390 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
193a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
193b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
193c0 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
193d0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
193e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
193f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
19400 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
19410 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se);.    }.    s
19420 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19430 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f  eLabel(v, labelO
19440 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  k);.    sqlite3R
19450 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19460 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  arse, regCkNull)
19470 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74  ;.    goto sqlit
19480 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
19490 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ished;.  }..  /*
194a0 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74   Step 2: Check t
194b0 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
194c0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
194d0 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20  LL columns.  If 
194e0 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65  the.  ** LHS doe
194f0 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20  s contain NULLs 
19500 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
19510 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46  must be either F
19520 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20  ALSE or NULL..  
19530 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20  ** We will then 
19540 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20  skip the binary 
19550 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48  search of the RH
19560 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
19570 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
19580 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73  False ){.    des
19590 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46  tStep2 = destIfF
195a0 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  alse;.  }else{. 
195b0 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
195c0 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74  estStep6 = sqlit
195d0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
195e0 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  v);.  }.  for(i=
195f0 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
19600 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
19610 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
19620 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78 70  ieldSubexpr(pExp
19630 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  r->pLeft, i);.  
19640 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
19650 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b  rCanBeNull(p) ){
19660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19680 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64  sNull, rLhs+i, d
19690 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20  estStep2);.     
196a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
196b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
196c0 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c  * Step 3.  The L
196d0 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20  HS is now known 
196e0 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  to be non-NULL. 
196f0 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73   Do the binary s
19700 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68  earch.  ** of th
19710 65 20 52 48 53 20 75 73 69 6e 67 20 74 68 65 20  e RHS using the 
19720 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20  LHS as a probe. 
19730 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72   If found, the r
19740 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72  esult is.  ** tr
19750 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ue..  */.  if( e
19760 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
19770 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OWID ){.    /* I
19780 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
19790 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49   RHS is the ROWI
197a0 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65  D of table b-tre
197b0 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f  e and so we also
197c0 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61  .    ** know tha
197d0 74 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e  t the RHS is non
197e0 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77  -NULL.  Hence, w
197f0 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20  e combine steps 
19800 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69  3 and 4.    ** i
19810 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  nto a single opc
19820 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ode. */.    sqli
19830 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19840 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70   OP_SeekRowid, p
19850 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
19860 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29  stIfFalse, rLhs)
19870 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
19880 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54  ge(v);.    addrT
19890 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33  ruthOp = sqlite3
198a0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
198b0 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75  _Goto);  /* Retu
198c0 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c  rn True */.  }el
198d0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
198e0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
198f0 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20  Affinity, rLhs, 
19900 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66  nVector, 0, zAff
19910 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
19920 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d  if( destIfFalse=
19930 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20  =destIfNull ){. 
19940 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20       /* Combine 
19950 53 74 65 70 20 33 20 61 6e 64 20 53 74 65 70 20  Step 3 and Step 
19960 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  5 into a single 
19970 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  opcode */.      
19980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19990 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
199a0 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
199b0 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
199c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
199d0 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73              rLhs
199e0 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65  , nVector); Vdbe
199f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19a00 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45     goto sqlite3E
19a10 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
19a20 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
19a30 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33   Ordinary Step 3
19a40 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  , for the case w
19a50 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e  here FALSE and N
19a60 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74  ULL are distinct
19a70 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74   */.    addrTrut
19a80 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  hOp = sqlite3Vdb
19a90 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
19aa0 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
19ab0 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20  Table, 0,.      
19ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20  rLhs, nVector); 
19af0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
19b10 34 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  4.  If the RHS i
19b20 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f  s known to be no
19b30 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69  n-NULL and we di
19b40 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20  d not find.  ** 
19b50 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20  an match on the 
19b60 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68  search above, th
19b70 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
19b80 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a  st be FALSE..  *
19b90 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61 73 4e  /.  if( rRhsHasN
19ba0 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d  ull && nVector==
19bb0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
19bc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19bd0 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61  _NotNull, rRhsHa
19be0 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c  sNull, destIfFal
19bf0 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  se);.    VdbeCov
19c00 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
19c10 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20   /* Step 5.  If 
19c20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
19c30 62 6f 75 74 20 74 68 65 20 64 69 66 66 65 72 65  bout the differe
19c40 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c  nce between NULL
19c50 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c   and.  ** FALSE,
19c60 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
19c70 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20  n false. .  */. 
19c80 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65   if( destIfFalse
19c90 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73  ==destIfNull ) s
19ca0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
19cb0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
19cc0 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f  .  /* Step 6: Lo
19cd0 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20  op through rows 
19ce0 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d  of the RHS.  Com
19cf0 70 61 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f  pare each row to
19d00 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49   the LHS..  ** I
19d10 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e  f any comparison
19d20 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
19d30 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
19d40 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20  L.  If all.  ** 
19d50 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20  comparisons are 
19d60 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66  FALSE then the f
19d70 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46  inal result is F
19d80 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ALSE..  **.  ** 
19d90 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53  For a scalar LHS
19da0 2c 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  , it is sufficie
19db0 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74  nt to check just
19dc0 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20   the first row. 
19dd0 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a   ** of the RHS..
19de0 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53    */.  if( destS
19df0 74 65 70 36 20 29 20 73 71 6c 69 74 65 33 56 64  tep6 ) sqlite3Vd
19e00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19e10 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20  , destStep6);.  
19e20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
19e30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19e40 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d  P_Rewind, pExpr-
19e50 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
19e60 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76  alse);.  VdbeCov
19e70 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
19e80 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
19e90 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73   destNotNull = s
19ea0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19eb0 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  bel(v);.  }else{
19ec0 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63  .    /* For nVec
19ed0 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20  tor==1, combine 
19ee0 73 74 65 70 73 20 36 20 61 6e 64 20 37 20 62 79  steps 6 and 7 by
19ef0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
19f00 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41  urning.    ** FA
19f10 4c 53 45 20 69 66 20 74 68 65 20 66 69 72 73 74  LSE if the first
19f20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
19f30 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64  ot NULL */.    d
19f40 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73  estNotNull = des
19f50 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20  tIfFalse;.  }.  
19f60 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
19f70 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  or; i++){.    Ex
19f80 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53  pr *p;.    CollS
19f90 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69  eq *pColl;.    i
19fa0 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47  nt r3 = sqlite3G
19fb0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19fc0 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
19fd0 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
19fe0 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
19ff0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1a000 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1a010 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73  Parse, p);.    s
1a020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a030 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1a040 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c  Expr->iTable, i,
1a050 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   r3);.    sqlite
1a060 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1a070 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65  P_Ne, rLhs+i, de
1a080 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20  stNotNull, r3,. 
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1a0b0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1a0c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a0d0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1a0e0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1a0f0 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a  Parse, r3);.  }.
1a100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a110 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1a120 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  0, destIfNull);.
1a130 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
1a140 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1a150 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a160 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a  , destNotNull);.
1a170 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a180 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
1a190 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1a1a0 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20   addrTop+1);.   
1a1b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a1c0 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37  ;..    /* Step 7
1a1d0 3a 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74  :  If we reach t
1a1e0 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
1a1f0 6f 77 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ow that the resu
1a200 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  lt must.    ** b
1a210 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20  e false. */.    
1a220 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a230 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1a240 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1a250 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68   }..  /* Jumps h
1a260 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ere in order to 
1a270 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a  return true. */.
1a280 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1a290 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 72 75  pHere(v, addrTru
1a2a0 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45  thOp);..sqlite3E
1a2b0 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1a2c0 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d  ed:.  if( rLhs!=
1a2d0 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74  rLhsOrig ) sqlit
1a2e0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1a2f0 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a  (pParse, rLhs);.
1a300 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1a310 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1a320 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1a330 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29   "end IN expr"))
1a340 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ;.sqlite3ExprCod
1a350 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20  eIN_oom_error:. 
1a360 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1a370 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70  Parse->db, aiMap
1a380 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1a390 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
1a3a0 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Aff);.}.#endif /
1a3b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
1a3c0 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
1a3d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1a3e0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
1a3f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
1a400 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1a410 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
1a420 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
1a430 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
1a440 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
1a450 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1a460 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
1a470 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
1a480 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
1a490 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
1a4a0 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
1a4b0 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
1a4c0 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
1a4d0 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
1a4e0 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
1a4f0 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
1a500 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
1a510 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a520 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
1a530 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
1a540 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
1a550 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
1a560 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
1a570 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
1a580 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  ue;.    sqlite3A
1a590 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
1a5a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1a5b0 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
1a5c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
1a5d0 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
1a5e0 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
1a5f0 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
1a600 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
1a610 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
1a620 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
1a630 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a640 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52  dOp4Dup8(v, OP_R
1a650 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
1a660 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
1a670 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
1a680 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
1a690 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
1a6a0 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
1a6b0 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
1a6c0 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
1a6d0 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
1a6e0 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1a6f0 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
1a700 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
1a710 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
1a720 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
1a730 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
1a740 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
1a750 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1a760 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
1a770 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
1a780 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1a790 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
1a7a0 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
1a7b0 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
1a7c0 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
1a7d0 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
1a7e0 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
1a7f0 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
1a800 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a810 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1a820 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
1a830 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1a840 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
1a850 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
1a860 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
1a870 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
1a880 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
1a890 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f   c = sqlite3DecO
1a8a0 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61  rHexToI64(z, &va
1a8b0 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  lue);.    if( c=
1a8c0 3d 31 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 21  =1 || (c==2 && !
1a8d0 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28 6e 65 67  negFlag) || (neg
1a8e0 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53  Flag && value==S
1a8f0 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b  MALLEST_INT64)){
1a900 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1a910 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1a920 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
1a930 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1a940 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
1a950 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
1a960 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
1a970 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65  z);.#else.#ifnde
1a980 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45  f SQLITE_OMIT_HE
1a990 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20  X_INTEGER.      
1a9a0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
1a9b0 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d  icmp(z,"0x",2)==
1a9c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1a9d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1a9e0 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61  rse, "hex litera
1a9f0 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22  l too big: %s%s"
1aa00 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22  , negFlag?"-":""
1aa10 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,z);.      }else
1aa20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
1aa30 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
1aa40 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
1aa50 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  iMem);.      }.#
1aa60 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
1aa70 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
1aa80 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d  ag ){ value = c=
1aa90 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  =2 ? SMALLEST_IN
1aaa0 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a  T64 : -value; }.
1aab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1aac0 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
1aad0 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d  P_Int64, 0, iMem
1aae0 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
1aaf0 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
1ab00 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1ab10 45 72 61 73 65 20 63 6f 6c 75 6d 6e 2d 63 61 63  Erase column-cac
1ab20 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72 20  he entry number 
1ab30 69 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  i.*/.static void
1ab40 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
1ab50 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ab60 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20 70 50  int i){.  if( pP
1ab70 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1ab80 69 5d 2e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20  i].tempReg ){.  
1ab90 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
1aba0 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
1abb0 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
1abc0 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  g) ){.      pPar
1abd0 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
1abe0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
1abf0 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   = pParse->aColC
1ac00 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20  ache[i].iReg;.  
1ac10 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65    }.  }.  pParse
1ac20 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20  ->nColCache--;. 
1ac30 20 69 66 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e   if( i<pParse->n
1ac40 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ColCache ){.    
1ac50 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1ac60 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61  e[i] = pParse->a
1ac70 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65 2d  ColCache[pParse-
1ac80 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 7d  >nColCache];.  }
1ac90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  .}.../*.** Recor
1aca0 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
1acb0 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61 72  cache that a par
1acc0 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66  ticular column f
1acd0 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75  rom a.** particu
1ace0 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f  lar table is sto
1acf0 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75  red in a particu
1ad00 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  lar register..*/
1ad10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1ad20 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72 73  rCacheStore(Pars
1ad30 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1ad40 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69  Tab, int iCol, i
1ad50 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
1ad60 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b  i;.  int minLru;
1ad70 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20  .  int idxLru;. 
1ad80 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1ad90 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65  e *p;..  /* Unle
1ada0 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ss an error has 
1adb0 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73 74  occurred, regist
1adc0 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  er numbers are a
1add0 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20  lways positive. 
1ade0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52 65  */.  assert( iRe
1adf0 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  g>0 || pParse->n
1ae00 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  Err || pParse->d
1ae10 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ae20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f  );.  assert( iCo
1ae30 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32  l>=-1 && iCol<32
1ae40 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74  768 );  /* Finit
1ae50 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73  e column numbers
1ae60 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51   */..  /* The SQ
1ae70 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
1ae80 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74   flag disables t
1ae90 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
1aea0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20    This is used. 
1aeb0 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20   ** for testing 
1aec0 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79  only - to verify
1aed0 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77   that SQLite alw
1aee0 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61 6d  ays gets the sam
1aef0 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69  e answer.  ** wi
1af00 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74  th and without t
1af10 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
1af20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .  */.  if( Opti
1af30 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
1af40 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  (pParse->db, SQL
1af50 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29  ITE_ColumnCache)
1af60 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
1af70 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61   First replace a
1af80 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  ny existing entr
1af90 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  y..  **.  ** Act
1afa0 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74  ually, the way t
1afb0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
1afc0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65  is currently use
1afd0 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e  d, we are guaran
1afe0 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74  teed.  ** that t
1aff0 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e  he object will n
1b000 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20  ever already be 
1b010 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66  in cache.  Verif
1b020 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65  y this guarantee
1b030 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ..  */.#ifndef N
1b040 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c  DEBUG.  for(i=0,
1b050 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1b060 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e  ache; i<pParse->
1b070 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20  nColCache; i++, 
1b080 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p++){.    assert
1b090 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  ( p->iTable!=iTa
1b0a0 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21  b || p->iColumn!
1b0b0 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e  =iCol );.  }.#en
1b0c0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
1b0d0 20 63 61 63 68 65 20 69 73 20 61 6c 72 65 61 64   cache is alread
1b0e0 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74 65 20 74  y full, delete t
1b0f0 68 65 20 6c 65 61 73 74 20 72 65 63 65 6e 74 6c  he least recentl
1b100 79 20 75 73 65 64 20 65 6e 74 72 79 20 2a 2f 0a  y used entry */.
1b110 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 43    if( pParse->nC
1b120 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49 54 45 5f  olCache>=SQLITE_
1b130 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b 0a 20 20  N_COLCACHE ){.  
1b140 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66    minLru = 0x7ff
1b150 66 66 66 66 66 3b 0a 20 20 20 20 69 64 78 4c 72  fffff;.    idxLr
1b160 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28  u = -1;.    for(
1b170 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1b180 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
1b190 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
1b1a0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, p++){.      
1b1b0 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72  if( p->lru<minLr
1b1c0 75 20 29 7b 0a 20 20 20 20 20 20 20 20 69 64 78  u ){.        idx
1b1d0 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  Lru = i;.       
1b1e0 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75   minLru = p->lru
1b1f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b200 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
1b210 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72  >aColCache[idxLr
1b220 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  u];.  }else{.   
1b230 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
1b240 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e  olCache[pParse->
1b250 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20 20  nColCache++];.  
1b260 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
1b270 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65  new entry to the
1b280 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68   end of the cach
1b290 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76 65 6c  e */.  p->iLevel
1b2a0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
1b2b0 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e 69 54 61  eLevel;.  p->iTa
1b2c0 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 70 2d  ble = iTab;.  p-
1b2d0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
1b2e0 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65  .  p->iReg = iRe
1b2f0 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  g;.  p->tempReg 
1b300 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d 20  = 0;.  p->lru = 
1b310 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
1b320 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  t++;.}../*.** In
1b330 64 69 63 61 74 65 20 74 68 61 74 20 72 65 67 69  dicate that regi
1b340 73 74 65 72 73 20 62 65 74 77 65 65 6e 20 69 52  sters between iR
1b350 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20  eg..iReg+nReg-1 
1b360 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72  are being overwr
1b370 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20  itten..** Purge 
1b380 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67  the range of reg
1b390 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20  isters from the 
1b3a0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f  column cache..*/
1b3b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1b3c0 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72  rCacheRemove(Par
1b3d0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1b3e0 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b  iReg, int nReg){
1b3f0 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
1b400 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73 65 2d  while( i<pParse-
1b410 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20  >nColCache ){.  
1b420 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1b430 68 65 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  he *p = &pParse-
1b440 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20  >aColCache[i];. 
1b450 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e     if( p->iReg >
1b460 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65  = iReg && p->iRe
1b470 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 7b  g < iReg+nReg ){
1b480 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
1b490 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69  yClear(pParse, i
1b4a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1b4b0 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20      i++;.    }. 
1b4c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65   }.}../*.** Reme
1b4d0 6d 62 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  mber the current
1b4e0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f   column cache co
1b4f0 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20  ntext.  Any new 
1b500 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a  entries added.**
1b510 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f   added to the co
1b520 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72  lumn cache after
1b530 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72   this call are r
1b540 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a  emoved when the.
1b550 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
1b560 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a   pop occurs..*/.
1b570 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1b580 43 61 63 68 65 50 75 73 68 28 50 61 72 73 65 20  CachePush(Parse 
1b590 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72  *pParse){.  pPar
1b5a0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b  se->iCacheLevel+
1b5b0 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  +;.#ifdef SQLITE
1b5c0 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1b5d0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1b5e0 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
1b5f0 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
1b600 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20 25 64  intf("PUSH to %d
1b610 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61  \n", pParse->iCa
1b620 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23  cheLevel);.  }.#
1b630 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
1b640 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63  emove from the c
1b650 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20  olumn cache any 
1b660 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 65 72  entries that wer
1b670 65 20 61 64 64 65 64 20 73 69 6e 63 65 20 74 68  e added since th
1b680 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  e.** the previou
1b690 73 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  s sqlite3ExprCac
1b6a0 68 65 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e  hePush operation
1b6b0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1b6c0 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68  s, restore.** th
1b6d0 65 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 73  e cache to the s
1b6e0 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 70  tate it was in p
1b6f0 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65  rior the most re
1b700 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f  cent Push..*/.vo
1b710 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1b720 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50  chePop(Parse *pP
1b730 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  arse){.  int i =
1b740 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
1b750 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1b760 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65  l>=1 );.  pParse
1b770 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b  ->iCacheLevel--;
1b780 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1b790 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1b7a0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1b7b0 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1b7c0 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1b7d0 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e  tf("POP  to %d\n
1b7e0 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
1b7f0 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
1b800 64 69 66 0a 20 20 77 68 69 6c 65 28 20 69 3c 70  dif.  while( i<p
1b810 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1b820 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
1b830 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
1b840 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e  .iLevel>pParse->
1b850 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20  iCacheLevel ){. 
1b860 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
1b870 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b  lear(pParse, i);
1b880 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b890 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    i++;.    }.  }
1b8a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61  .}../*.** When a
1b8b0 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69   cached column i
1b8c0 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73  s reused, make s
1b8d0 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67  ure that its reg
1b8e0 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c  ister is.** no l
1b8f0 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20  onger available 
1b900 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74  as a temp regist
1b910 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37  er.  ticket #387
1b920 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a  9:  that same.**
1b930 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20   register might 
1b940 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  be in the cache 
1b950 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
1b960 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74  es, so be sure t
1b970 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c  o.** get them al
1b980 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
1b990 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1b9a0 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61  hePinRegister(Pa
1b9b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1b9c0 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
1b9d0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1b9e0 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
1b9f0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1ba00 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1ba10 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1ba20 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
1ba30 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
1ba40 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
1ba50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
1ba60 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1ba70 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c  code that will l
1ba80 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65  oad into registe
1ba90 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65  r regOut a value
1baa0 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72   that is.** appr
1bab0 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
1bac0 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  iIdxCol-th colum
1bad0 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e  n of index pIdx.
1bae0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1baf0 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65  ExprCodeLoadInde
1bb00 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  xColumn(.  Parse
1bb10 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68   *pParse,  /* Th
1bb20 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1bb30 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  t */.  Index *pI
1bb40 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  dx,    /* The in
1bb50 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e  dex whose column
1bb60 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64   is to be loaded
1bb70 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
1bb80 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  r,    /* Cursor 
1bb90 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61  pointing to a ta
1bba0 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ble row */.  int
1bbb0 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20   iIdxCol,    /* 
1bbc0 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  The column of th
1bbd0 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f  e index to be lo
1bbe0 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  aded */.  int re
1bbf0 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f  gOut      /* Sto
1bc00 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  re the index col
1bc10 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69  umn value in thi
1bc20 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
1bc30 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d  .  i16 iTabCol =
1bc40 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1bc50 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20  iIdxCol];.  if( 
1bc60 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52  iTabCol==XN_EXPR
1bc70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1bc80 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29  pIdx->aColExpr )
1bc90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1bca0 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45  dx->aColExpr->nE
1bcb0 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20  xpr>iIdxCol );. 
1bcc0 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
1bcd0 54 61 62 20 3d 20 69 54 61 62 43 75 72 3b 0a 20  Tab = iTabCur;. 
1bce0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1bcf0 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70  deCopy(pParse, p
1bd00 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
1bd10 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c  [iIdxCol].pExpr,
1bd20 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73   regOut);.  }els
1bd30 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1bd40 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
1bd50 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70  fTable(pParse->p
1bd60 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62  Vdbe, pIdx->pTab
1bd70 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20  le, iTabCur,.   
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bda0 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74   iTabCol, regOut
1bdb0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1bdc0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1bdd0 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   extract the val
1bde0 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74  ue of the iCol-t
1bdf0 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  h column of a ta
1be00 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
1be10 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1be20 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20  olumnOfTable(.  
1be30 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
1be40 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65  /* The VDBE unde
1be50 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1be60 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1be70 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1be80 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1be90 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
1bea0 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68  TabCur,    /* Th
1beb0 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20  e table cursor. 
1bec0 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f   Or the PK curso
1bed0 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  r for WITHOUT RO
1bee0 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  WID */.  int iCo
1bef0 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  l,       /* Inde
1bf00 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
1bf10 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20  to extract */.  
1bf20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
1bf30 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
1bf40 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72  alue into this r
1bf50 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1bf60 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
1bf70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bf80 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1bf90 6e 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c  n, iTabCur, iCol
1bfa0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72  , regOut);.    r
1bfb0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
1bfc0 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
1bfd0 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
1bfe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bff0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
1c000 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
1c010 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
1c020 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
1c030 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
1c040 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
1c050 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  umn;.    int x =
1c060 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21   iCol;.    if( !
1c070 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
1c080 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
1c090 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20  b) ){.      x = 
1c0a0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
1c0b0 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d  ndex(sqlite3Prim
1c0c0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
1c0d0 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  ), iCol);.    }.
1c0e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c0f0 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61  ddOp3(v, op, iTa
1c100 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29  bCur, x, regOut)
1c110 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1c120 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
1c130 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
1c140 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72  v, pTab, iCol, r
1c150 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
1c160 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1c170 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  de that will ext
1c180 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e  ract the iColumn
1c190 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  -th column from.
1c1a0 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  ** table pTab an
1c1b0 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  d store the colu
1c1c0 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65  mn value in a re
1c1d0 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41  gister. .**.** A
1c1e0 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
1c1f0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
1c200 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
1c210 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68  gister iReg.  Th
1c220 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72  is.** is not gar
1c230 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74 43  anteeed for GetC
1c240 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65  olumn() - the re
1c250 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72  sult can be stor
1c260 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67  ed in.** any reg
1c270 69 73 74 65 72 2e 20 20 42 75 74 20 74 68 65 20  ister.  But the 
1c280 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e  result is guaran
1c290 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20  teed to land in 
1c2a0 72 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a  register iReg.**
1c2b0 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f   for GetColumnTo
1c2c0 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Reg()..**.** The
1c2d0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
1c2e0 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
1c2f0 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e  b in iTable when
1c300 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1c310 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20   is called.  If 
1c320 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
1c330 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
1c340 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
1c350 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  he rowid..*/.int
1c360 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c370 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  GetColumn(.  Par
1c380 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1c390 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1c3a0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1c3b0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1c3c0 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1c3d0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1c3e0 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1c3f0 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1c400 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1c410 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1c420 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1c430 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1c440 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1c450 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1c460 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1c470 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a   iReg,        /*
1c480 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1c490 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  ere */.  u8 p5  
1c4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20            /* P5 
1c4b0 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c  value for OP_Col
1c4c0 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29  umn + FLAGS */.)
1c4d0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1c4e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1c4f0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1c500 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
1c510 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1c520 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1c530 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1c540 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
1c550 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d    if( p->iTable=
1c560 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43  =iTable && p->iC
1c570 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
1c580 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d  {.      p->lru =
1c590 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
1c5a0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
1c5b0 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52  te3ExprCachePinR
1c5c0 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
1c5d0 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20  p->iReg);.      
1c5e0 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a  return p->iReg;.
1c5f0 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73      }.  }  .  as
1c600 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
1c610 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1c620 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1c630 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c  v, pTab, iTable,
1c640 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1c650 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20  .  if( p5 ){.   
1c660 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1c670 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d  geP5(v, p5);.  }
1c680 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c  else{   .    sql
1c690 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1c6a0 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c  re(pParse, iTabl
1c6b0 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
1c6c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1c6d0 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  iReg;.}.void sql
1c6e0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1c6f0 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61  olumnToReg(.  Pa
1c700 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
1c710 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1c720 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1c730 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
1c740 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
1c750 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1c760 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
1c770 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
1c780 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
1c790 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1c7a0 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
1c7b0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1c7c0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1c7d0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
1c7e0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1c7f0 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20 2f  t iReg         /
1c800 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
1c810 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1c820 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1c830 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
1c840 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f  Parse, pTab, iCo
1c850 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52  lumn, iTable, iR
1c860 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31  eg, 0);.  if( r1
1c870 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65 33  !=iReg ) sqlite3
1c880 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
1c890 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
1c8a0 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d  py, r1, iReg);.}
1c8b0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  .../*.** Clear a
1c8c0 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
1c8d0 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64  entries..*/.void
1c8e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c8f0 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  eClear(Parse *pP
1c900 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
1c910 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1c920 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1c930 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1c940 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1c950 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1c960 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20  tf("CLEAR\n");. 
1c970 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
1c980 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
1c990 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a  ColCache; i++){.
1c9a0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1c9b0 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d  aColCache[i].tem
1c9c0 70 52 65 67 0a 20 20 20 20 20 26 26 20 70 50 61  pReg.     && pPa
1c9d0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
1c9e0 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
1c9f0 61 54 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b  aTempReg).    ){
1ca00 0a 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  .       pParse->
1ca10 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
1ca20 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
1ca30 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1ca40 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a  [i].iReg;.    }.
1ca50 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43    }.  pParse->nC
1ca60 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a  olCache = 0;.}..
1ca70 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
1ca80 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66   fact that an af
1ca90 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
1caa0 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43  s occurred on iC
1cab0 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  ount.** register
1cac0 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
1cad0 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20  iStart..*/.void 
1cae0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1caf0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50  AffinityChange(P
1cb00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1cb10 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43  t iStart, int iC
1cb20 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  ount){.  sqlite3
1cb30 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1cb40 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20  pParse, iStart, 
1cb50 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCount);.}../*.*
1cb60 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1cb70 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
1cb80 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
1cb90 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
1cba0 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
1cbb0 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20  To..iTo+nReg-1. 
1cbc0 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
1cbd0 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
1cbe0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1cbf0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
1cc00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1cc10 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
1cc20 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73   int nReg){.  as
1cc30 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f  sert( iFrom>=iTo
1cc40 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e  +nReg || iFrom+n
1cc50 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71  Reg<=iTo );.  sq
1cc60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cc70 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1cc80 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
1cc90 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c  To, nReg);.  sql
1cca0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1ccb0 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f  ove(pParse, iFro
1ccc0 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66  m, nReg);.}..#if
1ccd0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1cce0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1ccf0 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  d(SQLITE_COVERAG
1cd00 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1cd10 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
1cd20 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
1cd30 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54   range iFrom..iT
1cd40 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a  o (inclusive).**
1cd50 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
1cd60 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   of the column c
1cd70 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
1cd80 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1cd90 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
1cda0 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20   and testcase() 
1cdb0 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61  macros only.** a
1cdc0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  nd does not appe
1cdd0 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62  ar in a normal b
1cde0 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
1cdf0 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  int usedAsColumn
1ce00 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
1ce10 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
1ce20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20  int iTo){.  int 
1ce30 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1ce40 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
1ce50 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1ce60 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1ce70 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1ce80 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
1ce90 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
1cea0 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20     if( r>=iFrom 
1ceb0 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75  && r<=iTo ) retu
1cec0 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45  rn 1;    /*NO_TE
1ced0 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ST*/.  }.  retur
1cee0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
1cef0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c   SQLITE_DEBUG ||
1cf00 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45   SQLITE_COVERAGE
1cf10 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  _TEST */.../*.**
1cf20 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61   Convert a scala
1cf30 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  r expression nod
1cf40 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  e to a TK_REGIST
1cf50 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a  ER referencing.*
1cf60 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  * register iReg.
1cf70 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73    The caller mus
1cf80 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 52  t ensure that iR
1cf90 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  eg already conta
1cfa0 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ins.** the corre
1cfb0 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  ct value for the
1cfc0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
1cfd0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
1cfe0 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20  ToRegister(Expr 
1cff0 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  *p, int iReg){. 
1d000 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b   p->op2 = p->op;
1d010 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  .  p->op = TK_RE
1d020 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61  GISTER;.  p->iTa
1d030 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78  ble = iReg;.  Ex
1d040 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
1d050 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a  p, EP_Skip);.}..
1d060 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61  /*.** Evaluate a
1d070 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69  n expression (ei
1d080 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72  ther a vector or
1d090 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
1d0a0 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a  sion) and store.
1d0b0 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  ** the result in
1d0c0 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d   continguous tem
1d0d0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1d0e0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1d0f0 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  dex of.** the fi
1d100 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65  rst register use
1d110 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  d to store the r
1d120 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  esult..**.** If 
1d130 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1d140 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
1d150 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c  a temporary scal
1d160 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  ar, then also wr
1d170 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69  ite.** that regi
1d180 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f  ster number into
1d190 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49   *piFreeable.  I
1d1a0 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1d1b0 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a  esult register.*
1d1c0 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  * is not a tempo
1d1d0 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65  rary or if the e
1d1e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
1d1f0 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65  ector set *piFre
1d200 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a  eable.** to 0..*
1d210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1d220 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
1d230 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1d240 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61  *p, int *piFreea
1d250 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73  ble){.  int iRes
1d260 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75  ult;.  int nResu
1d270 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
1d280 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20  VectorSize(p);. 
1d290 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20   if( nResult==1 
1d2a0 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d  ){.    iResult =
1d2b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d2c0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Temp(pParse, p, 
1d2d0 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d  piFreeable);.  }
1d2e0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65  else{.    *piFre
1d2f0 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69  eable = 0;.    i
1d300 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  f( p->op==TK_SEL
1d310 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ECT ){.#if SQLIT
1d320 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1d330 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20        iResult = 
1d340 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  0;.#else.      i
1d350 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
1d360 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
1d370 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  arse, p, 0, 0);.
1d380 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1d390 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1d3a0 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70       iResult = p
1d3b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1d3c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
1d3d0 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20  m += nResult;.  
1d3e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1d3f0 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20  Result; i++){.  
1d400 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d410 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
1d420 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69  pParse, p->x.pLi
1d430 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1d440 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  i+iResult);.    
1d450 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1d460 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a  return iResult;.
1d470 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1d480 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1d490 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1d4a0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1d4b0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1d4c0 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1d4d0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1d4e0 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1d4f0 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1d500 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1d510 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1d520 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1d530 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1d540 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1d550 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1d560 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1d570 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1d580 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1d590 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1d5a0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1d5b0 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1d5c0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1d5d0 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1d5e0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1d5f0 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1d600 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1d610 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1d620 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1d630 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1d640 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d650 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1d660 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1d670 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1d680 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1d690 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1d6a0 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1d6b0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1d6c0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1d6d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1d6e0 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1d6f0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1d700 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1d710 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1d720 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1d730 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1d740 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1d750 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1d760 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1d770 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1d780 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1d790 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1d7a0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1d7b0 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1d7c0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1d7d0 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1d7e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1d7f0 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1d800 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20  mbers */.  Expr 
1d810 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20  tempX;          
1d820 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
1d830 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  y expression nod
1d840 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20  e */.  int p5 = 
1d850 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  0;..  assert( ta
1d860 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
1d870 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
1d880 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
1d890 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1d8a0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1d8b0 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
1d8c0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
1d8d0 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
1d8e0 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
1d8f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
1d900 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
1d910 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1d920 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1d930 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1d940 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1d950 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
1d960 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
1d970 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1d980 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
1d990 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
1d9a0 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
1d9b0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
1d9c0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
1d9d0 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
1d9e0 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  m>0 );.        r
1d9f0 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d  eturn pCol->iMem
1da00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1da10 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
1da20 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
1da30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1da40 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1da50 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
1da60 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20  ortingIdxPTab,. 
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1da90 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1daa0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1dab0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1dac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dad0 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
1dae0 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
1daf0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
1db00 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
1db10 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
1db20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20       int iTab = 
1db30 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1db40 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
1db50 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1db60 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20  Parse->ckBase>0 
1db70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1db80 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43 4b  Generating CHECK
1db90 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20   constraints or 
1dba0 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 70  inserting into p
1dbb0 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a  artial index */.
1dbc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1dbd0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
1dbe0 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65  + pParse->ckBase
1dbf0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1dc00 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
1dc10 64 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  ding an expressi
1dc20 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20  on that is part 
1dc30 6f 66 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72  of an index wher
1dc40 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  e column names. 
1dc50 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74           ** in t
1dc60 68 65 20 69 6e 64 65 78 20 72 65 66 65 72 20 74  he index refer t
1dc70 6f 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77  o the table to w
1dc80 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 62  hich the index b
1dc90 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20  elongs */.      
1dca0 20 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73      iTab = pPars
1dcb0 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20  e->iSelfTab;.   
1dcc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1dcd0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1dce0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1dcf0 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
1dd00 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20  pr->pTab,.      
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1dd30 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74  iColumn, iTab, t
1dd40 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
1dd70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
1dd80 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
1dd90 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
1dda0 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
1ddb0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1ddc0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1ddd0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1dde0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1ddf0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63  TING_POINT.    c
1de00 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
1de10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1de20 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1de30 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1de40 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  e) );.      code
1de50 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75  Real(v, pExpr->u
1de60 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67  .zToken, 0, targ
1de70 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1de80 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1de90 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1dea0 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
1deb0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1dec0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ded0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1dee0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1def0 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
1df00 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70 72 2d  , target, pExpr-
1df10 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1df20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1df30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1df40 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
1df50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1df60 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1df70 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1df80 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1df90 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1dfa0 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
1dfb0 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
1dfc0 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
1dfd0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
1dfe0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
1dff0 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a     char *zBlob;.
1e000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1e010 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1e020 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1e030 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
1e040 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1e050 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  ken[0]=='x' || p
1e060 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1e070 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
1e080 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1e090 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27  .zToken[1]=='\''
1e0a0 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70   );.      z = &p
1e0b0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32  Expr->u.zToken[2
1e0c0 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ];.      n = sql
1e0d0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
1e0e0 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
1e0f0 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b  t( z[n]=='\'' );
1e100 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73  .      zBlob = s
1e110 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
1e120 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
1e130 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
1e140 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e150 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32  (v, OP_Blob, n/2
1e160 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c  , target, 0, zBl
1e170 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ob, P4_DYNAMIC);
1e180 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1e190 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
1e1a0 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
1e1b0 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
1e1c0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1e1d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1e1e0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1e1f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e200 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  Expr->u.zToken!=
1e210 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1e220 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1e230 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  en[0]!=0 );.    
1e240 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e250 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  Op2(v, OP_Variab
1e260 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
1e270 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
1e280 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e     if( pExpr->u.
1e290 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a  zToken[1]!=0 ){.
1e2a0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1e2b0 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 56  ar *z = sqlite3V
1e2c0 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50  ListNumToName(pP
1e2d0 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 70 45  arse->pVList, pE
1e2e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1e2f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1e300 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1e310 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63 6d 70  ]=='?' || strcmp
1e320 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1e330 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  , z)==0 );.     
1e340 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
1e350 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e 64  t[0] = 0; /* Ind
1e360 69 63 61 74 65 20 56 4c 69 73 74 20 6d 61 79 20  icate VList may 
1e370 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65 6e 6c  no longer be enl
1e380 61 72 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  arged */.       
1e390 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
1e3a0 6e 64 50 34 28 76 2c 20 28 63 68 61 72 2a 29 7a  ndP4(v, (char*)z
1e3b0 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
1e3c0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1e3d0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1e3e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
1e3f0 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ISTER: {.      r
1e400 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54 61  eturn pExpr->iTa
1e410 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  ble;.    }.#ifnd
1e420 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1e430 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
1e440 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
1e450 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
1e460 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
1e470 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
1e480 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20   */.      inReg 
1e490 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e4a0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1e4b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
1e4c0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1e4d0 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29   inReg!=target )
1e4e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e4f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e500 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
1e510 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1e520 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
1e530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1e540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e550 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72  (v, OP_Cast, tar
1e560 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1e580 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
1e590 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1e5a0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74 65 73  , 0));.      tes
1e5b0 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c  tcase( usedAsCol
1e5c0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
1e5d0 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29   inReg, inReg) )
1e5e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e5f0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1e600 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
1e610 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  nReg, 1);.      
1e620 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20  return inReg;.  
1e630 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1e640 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
1e650 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  /.    case TK_IS
1e660 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
1e670 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20  NOT:.      op = 
1e680 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
1e690 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
1e6a0 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e     p5 = SQLITE_N
1e6b0 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20  ULLEQ;.      /* 
1e6c0 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a  fall-through */.
1e6d0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
1e6e0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
1e6f0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
1e700 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
1e710 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
1e720 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
1e730 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
1e740 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
1e750 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ft;.      if( sq
1e760 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
1e770 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  r(pLeft) ){.    
1e780 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72 43 6f      codeVectorCo
1e790 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1e7a0 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c  xpr, target, op,
1e7b0 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   p5);.      }els
1e7c0 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
1e7d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e7e0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66  emp(pParse, pLef
1e7f0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1e800 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
1e810 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e820 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e830 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1e840 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 43  );.        codeC
1e850 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1e860 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1e870 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1e880 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
1e890 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
1e8a0 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20 20 20  P2 | p5);.      
1e8b0 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
1e8c0 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
1e8d0 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
1e8e0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1e8f0 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
1e900 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
1e910 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
1e920 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
1e930 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1e940 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
1e950 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
1e960 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
1e970 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
1e980 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1e990 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
1e9a0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
1e9b0 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
1e9c0 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
1e9d0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1e9e0 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
1e9f0 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
1ea00 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
1ea10 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62  (op==OP_Eq); Vdb
1ea20 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1ea30 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
1ea40 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
1ea50 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
1ea60 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
1ea70 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1ea80 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
1ea90 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1eaa0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1eab0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1eac0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1ead0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1eae0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1eaf0 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
1eb00 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
1eb10 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
1eb20 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
1eb30 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
1eb40 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
1eb50 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
1eb60 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
1eb70 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
1eb80 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
1eb90 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
1eba0 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
1ebb0 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  : .    case TK_C
1ebc0 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  ONCAT: {.      a
1ebd0 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f  ssert( TK_AND==O
1ebe0 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20  P_And );        
1ebf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ec00 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
1ec10 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d    assert( TK_OR=
1ec20 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20  =OP_Or );       
1ec30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ec40 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20   op==TK_OR );.  
1ec50 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50      assert( TK_P
1ec60 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20  LUS==OP_Add );  
1ec70 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1ec80 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29  e( op==TK_PLUS )
1ec90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1eca0 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62  TK_MINUS==OP_Sub
1ecb0 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65 73  tract );     tes
1ecc0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49  tcase( op==TK_MI
1ecd0 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73  NUS );.      ass
1ece0 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f  ert( TK_REM==OP_
1ecf0 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20  Remainder );    
1ed00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ed10 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20  TK_REM );.      
1ed20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e  assert( TK_BITAN
1ed30 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20  D==OP_BitAnd ); 
1ed40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ed50 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a  p==TK_BITAND );.
1ed60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ed70 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72  _BITOR==OP_BitOr
1ed80 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74 63   );        testc
1ed90 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f  ase( op==TK_BITO
1eda0 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
1edb0 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
1edc0 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20 20  Divide );       
1edd0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ede0 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20  _SLASH );.      
1edf0 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
1ee00 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
1ee10 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
1ee20 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a  p==TK_LSHIFT );.
1ee30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ee40 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _RSHIFT==OP_Shif
1ee50 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74 63  tRight );  testc
1ee60 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49  ase( op==TK_RSHI
1ee70 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  FT );.      asse
1ee80 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
1ee90 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20  P_Concat );     
1eea0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1eeb0 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20  K_CONCAT );.    
1eec0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1eed0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1eee0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1eef0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1ef00 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1ef10 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ef20 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1ef30 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1ef40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ef50 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32  AddOp3(v, op, r2
1ef60 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
1ef70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1ef80 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1ef90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1efa0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1efb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1efc0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
1efd0 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  US: {.      Expr
1efe0 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
1eff0 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73  >pLeft;.      as
1f000 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
1f010 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
1f020 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
1f030 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e  {.        codeIn
1f040 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c  teger(pParse, pL
1f050 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  eft, 1, target);
1f060 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f070 74 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20  target;.#ifndef 
1f080 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1f090 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
1f0a0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74   }else if( pLeft
1f0b0 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
1f0c0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1f0d0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1f0e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1f0f0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1f100 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c    codeReal(v, pL
1f110 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31  eft->u.zToken, 1
1f120 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f130 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1f140 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
1f150 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
1f160 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45  mpX.op = TK_INTE
1f170 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  GER;.        tem
1f180 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e  pX.flags = EP_In
1f190 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f  tValue|EP_TokenO
1f1a0 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  nly;.        tem
1f1b0 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b  pX.u.iValue = 0;
1f1c0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
1f1d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f1e0 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58  p(pParse, &tempX
1f1f0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f200 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1f210 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f220 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f230 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  eft, &regFree2);
1f240 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f250 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1f260 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72  _Subtract, r2, r
1f270 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1f280 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f290 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1f2a0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1f2b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f2c0 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20   TK_BITNOT:.    
1f2d0 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
1f2e0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f2f0 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f  BITNOT==OP_BitNo
1f300 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  t );   testcase(
1f310 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29   op==TK_BITNOT )
1f320 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f330 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29  TK_NOT==OP_Not )
1f340 3b 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;         testca
1f350 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29  se( op==TK_NOT )
1f360 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1f370 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f380 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f390 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1f3a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f3b0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f3c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f3d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
1f3e0 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20   r1, inReg);.   
1f3f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f400 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
1f410 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
1f420 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
1f430 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
1f440 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
1f450 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
1f460 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f470 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
1f480 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
1f490 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
1f4a0 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20  ll ); testcase( 
1f4b0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
1f4c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f4d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1f4e0 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
1f4f0 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  et);.      r1 = 
1f500 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f510 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f520 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1f530 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
1f540 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f550 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  0 );.      addr 
1f560 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1f570 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a  Op1(v, op, r1);.
1f580 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1f590 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
1f5a0 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
1f5b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1f5c0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
1f5d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f5e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1f5f0 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65  nteger, 0, targe
1f600 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1f610 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1f620 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
1f630 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f640 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
1f650 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  ION: {.      Agg
1f660 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45  Info *pInfo = pE
1f670 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
1f680 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d       if( pInfo==
1f690 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1f6a0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1f6b0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1f6c0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1f6d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1f6e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
1f6f0 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
1f700 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d  e: %s()", pExpr-
1f710 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1f720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f730 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61   return pInfo->a
1f740 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
1f750 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ].iMem;.      }.
1f760 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f770 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
1f780 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
1f790 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67   ExprList *pFarg
1f7a0 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
1f7b0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1f7c0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
1f7d0 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20  nt nFarg;       
1f7e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f7f0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1f800 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46  ments */.      F
1f810 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
1f820 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
1f830 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
1f840 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20   object */.     
1f850 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
1f860 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;       /* The f
1f870 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1f880 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d        u32 constM
1f890 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ask = 0;     /* 
1f8a0 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e  Mask of function
1f8b0 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20   arguments that 
1f8c0 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a  are constant */.
1f8d0 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f8f0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1f900 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1f910 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1f920 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1f930 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1f940 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
1f950 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54  C(db);      /* T
1f960 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
1f970 20 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61   used by this da
1f980 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
1f990 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
1f9a0 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c   0;    /* A coll
1f9b0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
1f9c0 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 43 6f 6e  /..      if( Con
1f9d0 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
1f9e0 65 29 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  e) && sqlite3Exp
1f9f0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
1fa00 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  in(pExpr) ){.   
1fa10 20 20 20 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63       /* SQL func
1fa20 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 65 78 70  tions can be exp
1fa30 65 6e 73 69 76 65 2e 20 53 6f 20 74 72 79 20 74  ensive. So try t
1fa40 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e 74 20  o move constant 
1fa50 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20  functions.      
1fa60 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
1fa70 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76 65 6e  inner loop, even
1fa80 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 61   if that means a
1fa90 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f 70 79 2e  n extra OP_Copy.
1faa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
1fab0 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
1fac0 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
1fad0 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 20   pExpr, -1);.   
1fae0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1faf0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1fb00 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1fb10 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1fb20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1fb30 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1fb40 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
1fb50 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
1fb60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1fb70 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
1fb80 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1fb90 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
1fba0 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
1fbb0 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
1fbc0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1fbd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1fbe0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1fbf0 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
1fc00 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
1fc10 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
1fc20 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
1fc30 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67  n(db, zId, nFarg
1fc40 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65  , enc, 0);.#ifde
1fc50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1fc60 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43  UNKNOWN_SQL_FUNC
1fc70 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70  TION.      if( p
1fc80 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65  Def==0 && pParse
1fc90 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
1fca0 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
1fcb0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
1fcc0 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e  db, "unknown", n
1fcd0 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Farg, enc, 0);. 
1fce0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1fcf0 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
1fd00 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69  || pDef->xFinali
1fd10 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ze!=0 ){.       
1fd20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1fd30 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
1fd40 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29  n function: %s()
1fd50 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  ", zId);.       
1fd60 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1fd70 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70  .      /* Attemp
1fd80 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65  t a direct imple
1fd90 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1fda0 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53   built-in COALES
1fdb0 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  CE() and.      *
1fdc0 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74  * IFNULL() funct
1fdd0 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69  ions.  This avoi
1fde0 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65  ds unnecessary e
1fdf0 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20  valuation of.   
1fe00 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20     ** arguments 
1fe10 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  past the first n
1fe20 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
1fe30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1fe40 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
1fe50 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
1fe60 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20  NC_COALESCE ){. 
1fe70 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f         int endCo
1fe80 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33  alesce = sqlite3
1fe90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1fea0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1feb0 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20  ( nFarg>=2 );.  
1fec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1fed0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
1fee0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
1fef0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1ff00 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61    for(i=1; i<nFa
1ff10 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
1ff20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ff30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
1ff40 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64  ull, target, end
1ff50 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
1ff60 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1ff70 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
1ff80 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ff90 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74  Remove(pParse, t
1ffa0 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20  arget, 1);.     
1ffb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ffc0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1ffd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1ffe0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1fff0 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
20000 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
20010 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20020 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
20030 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
20040 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
20050 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
20060 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  l(v, endCoalesce
20070 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
20080 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
20090 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59   /* The UNLIKELY
200a0 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  () function is a
200b0 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73   no-op.  The res
200c0 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65  ult is the value
200d0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
200e0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
200f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20100 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
20110 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
20120 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20  C_UNLIKELY ){.  
20130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
20140 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg>=1 );.      
20150 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20160 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
20170 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
20180 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
20190 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  );.      }..#ifd
201a0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
201b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 41 46 46        /* The AFF
201c0 49 4e 49 54 59 28 29 20 66 75 6e 63 74 69 6f 6e  INITY() function
201d0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20   evaluates to a 
201e0 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
201f0 72 69 62 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  ribes.      ** t
20200 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  he type affinity
20210 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
20220 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
20230 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 66 0a 20  for testing of. 
20240 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69       ** the SQLi
20250 74 65 20 74 79 70 65 20 6c 6f 67 69 63 2e 0a 20  te type logic.. 
20260 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
20270 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
20280 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
20290 41 46 46 49 4e 49 54 59 20 29 7b 0a 20 20 20 20  AFFINITY ){.    
202a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
202b0 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f  azAff[] = { "blo
202c0 62 22 2c 20 22 74 65 78 74 22 2c 20 22 6e 75 6d  b", "text", "num
202d0 65 72 69 63 22 2c 20 22 69 6e 74 65 67 65 72 22  eric", "integer"
202e0 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20 20 20  , "real" };.    
202f0 20 20 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20      char aff;.  
20300 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
20310 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg==1 );.      
20320 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45    aff = sqlite3E
20330 78 70 72 41 66 66 69 6e 69 74 79 28 70 46 61 72  xprAffinity(pFar
20340 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
20350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20360 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
20370 20 74 61 72 67 65 74 2c 20 0a 20 20 20 20 20 20   target, .      
20380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20390 20 20 20 20 20 20 20 20 61 66 66 20 3f 20 61 7a          aff ? az
203a0 41 66 66 5b 61 66 66 2d 53 51 4c 49 54 45 5f 41  Aff[aff-SQLITE_A
203b0 46 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e 65  FF_BLOB] : "none
203c0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
203d0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20  rn target;.     
203e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
203f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72   for(i=0; i<nFar
20400 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
20410 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c   if( i<32 && sql
20420 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
20430 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  nt(pFarg->a[i].p
20440 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
20450 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
20460 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  31 );.          
20470 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53  constMask |= MAS
20480 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20  KBIT32(i);.     
20490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
204a0 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
204b0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
204c0 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20  NEEDCOLL)!=0 && 
204d0 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
204e0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
204f0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
20500 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
20510 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
20520 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
20530 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
20540 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73          if( cons
20550 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20  tMask ){.       
20560 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e     r1 = pParse->
20570 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
20580 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
20590 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20  = nFarg;.       
205a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
205b0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
205c0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
205d0 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  e, nFarg);.     
205e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
205f0 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e   For length() an
20600 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74  d typeof() funct
20610 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75  ions with a colu
20620 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20  mn argument,.   
20630 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20       ** set the 
20640 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  P5 parameter to 
20650 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70  the OP_Column op
20660 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c  code to OPFLAG_L
20670 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20  ENGTHARG.       
20680 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59   ** or OPFLAG_TY
20690 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69  PEOFARG respecti
206a0 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75  vely, to avoid u
206b0 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a  nnecessary data.
206c0 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69          ** loadi
206d0 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ng..        */. 
206e0 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
206f0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53  ->funcFlags & (S
20700 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
20710 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  H|SQLITE_FUNC_TY
20720 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20  PEOF))!=0 ){.   
20730 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70         u8 exprOp
20740 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
20750 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a  rt( nFarg==1 );.
20760 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
20770 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  ( pFarg->a[0].pE
20780 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
20790 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61      exprOp = pFa
207a0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  rg->a[0].pExpr->
207b0 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  op;.          if
207c0 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c  ( exprOp==TK_COL
207d0 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54  UMN || exprOp==T
207e0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
207f0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
20800 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
20810 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c  LENGTH==OPFLAG_L
20820 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
20830 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20840 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
20850 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f  OF==OPFLAG_TYPEO
20860 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  FARG );.        
20870 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
20880 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20890 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
208a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
208b0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
208c0 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20  r->op2 = .      
208d0 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66              pDef
208e0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f  ->funcFlags & (O
208f0 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c  PFLAG_LENGTHARG|
20900 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
20910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
20920 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
20930 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
20940 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20  hePush(pParse); 
20950 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
20960 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
20970 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20980 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
20990 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
209a0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209c0 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f      SQLITE_ECEL_
209d0 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f  DUP|SQLITE_ECEL_
209e0 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20  FACTOR);.       
209f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
20a00 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20  ePop(pParse);   
20a10 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
20a20 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
20a30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20a40 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20    r1 = 0;.      
20a50 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
20a60 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
20a70 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
20a80 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
20a90 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
20aa0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
20ab0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
20ac0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
20ad0 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
20ae0 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
20af0 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
20b00 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
20b10 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
20b20 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
20b30 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
20b40 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
20b50 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
20b60 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
20b70 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
20b80 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
20b90 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
20ba0 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
20bb0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
20bc0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
20bd0 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
20be0 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
20bf0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
20c00 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
20c10 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
20c20 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
20c30 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
20c40 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
20c50 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
20c60 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
20c70 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
20c80 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
20c90 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
20ca0 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
20cb0 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
20cc0 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
20cd0 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
20ce0 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
20cf0 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
20d00 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
20d10 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20     if( nFarg>=2 
20d20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
20d30 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
20d40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
20d50 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
20d60 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
20d70 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
20d80 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
20d90 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
20da0 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
20db0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
20dc0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
20dd0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
20de0 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
20df0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
20e00 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
20e10 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
20e20 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
20e30 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
20e40 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
20e50 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
20e60 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
20e70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20e80 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
20e90 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
20ea0 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
20eb0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
20ec0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
20ed0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
20ee0 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 63 6f  OP_Function0, co
20ef0 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72  nstMask, r1, tar
20f00 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
20f20 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
20f30 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c  CDEF);.      sql
20f40 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
20f50 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a  (v, (u8)nFarg);.
20f60 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20        if( nFarg 
20f70 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20  && constMask==0 
20f80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20f90 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
20fa0 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
20fb0 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Farg);.      }. 
20fc0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
20fd0 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  et;.    }.#ifnde
20fe0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
20ff0 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
21000 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
21010 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
21020 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  .      int nCol;
21030 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21040 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29   op==TK_EXISTS )
21050 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21060 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
21070 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  );.      if( op=
21080 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 28 6e  =TK_SELECT && (n
21090 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  Col = pExpr->x.p
210a0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
210b0 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20 20 20  nExpr)!=1 ){.   
210c0 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73       sqlite3Subs
210d0 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
210e0 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20  e, nCol, 1);.   
210f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21100 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
21110 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
21120 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
21130 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
21140 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
21150 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
21160 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  T_COLUMN: {.    
21170 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69    int n;.      i
21180 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  f( pExpr->pLeft-
21190 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20  >iTable==0 ){.  
211a0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
211b0 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c  ft->iTable = sql
211c0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
211d0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
211e0 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20  >pLeft, 0, 0);. 
211f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
21200 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62  ert( pExpr->iTab
21210 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e  le==0 || pExpr->
21220 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pLeft->op==TK_SE
21230 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66  LECT );.      if
21240 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a  ( pExpr->iTable.
21250 20 20 20 20 20 20 20 26 26 20 70 45 78 70 72 2d         && pExpr-
21260 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73 71  >iTable!=(n = sq
21270 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
21280 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ize(pExpr->pLeft
21290 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
212a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
212b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
212c0 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
212d0 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
21300 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b  xpr->iTable, n);
21310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
21320 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65  eturn pExpr->pLe
21330 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78  ft->iTable + pEx
21340 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
21350 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
21360 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
21370 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
21380 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
21390 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
213a0 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
213b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
213c0 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
213d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
213e0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
213f0 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
21400 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
21410 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
21420 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
21430 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
21440 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21450 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
21460 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21470 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
21480 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
21490 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73  fFalse);.      s
214a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
214b0 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74  (v, OP_AddImm, t
214c0 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20  arget, 0);.     
214d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
214e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
214f0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 72  IfNull);.      r
21500 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
21510 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
21520 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
21530 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20  RY */...    /*. 
21540 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45     **    x BETWE
21550 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a  EN y AND z.    *
21560 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  *.    ** This is
21570 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
21580 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
21590 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20  x>=y AND x<=z.  
215a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73    **.    ** X is
215b0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
215c0 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
215d0 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Y is stored in p
215e0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
215f0 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20  ].pExpr..    ** 
21600 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Z is stored in p
21610 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
21620 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a  ].pExpr..    */.
21630 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
21640 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78 70  EEN: {.      exp
21650 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
21660 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
21670 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  et, 0, 0);.     
21680 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
21690 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
216a0 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65  K_SPAN:.    case
216b0 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20   TK_COLLATE: .  
216c0 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
216d0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
216e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
216f0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
21700 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
21710 65 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  et);.    }..    
21720 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a  case TK_TRIGGER:
21730 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
21740 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f  he opcode is TK_
21750 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68  TRIGGER, then th
21760 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
21770 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  a reference.    
21780 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e    ** to a column
21790 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72   in the new.* or
217a0 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
217b0 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74  bles available t
217c0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67  o.      ** trigg
217d0 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20  er programs. In 
217e0 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69  this case Expr.i
217f0 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
21800 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20  1 for the.      
21810 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  ** new.* pseudo-
21820 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20  table, or 0 for 
21830 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
21840 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f  -table. Expr.iCo
21850 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  lumn.      ** is
21860 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   set to the colu
21870 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f  mn of the pseudo
21880 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20  -table to read, 
21890 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20  or to -1 to.    
218a0 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f    ** read the ro
218b0 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20  wid field..     
218c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
218d0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69   expression is i
218e0 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
218f0 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63   an OP_Param opc
21900 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20  ode. The p1.    
21910 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69    ** parameter i
21920 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61  s set to 0 for a
21930 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65  n old.rowid refe
21940 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b  rence, or to (i+
21950 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  1).      ** to r
21960 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72  eference another
21970 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f   column of the o
21980 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
21990 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20  e, where .      
219a0 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65  ** i is the inde
219b0 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  x of the column.
219c0 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64   For a new.rowid
219d0 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69   reference, p1 i
219e0 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74  s.      ** set t
219f0 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e  o (n+1), where n
21a00 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
21a10 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63  f columns in eac
21a20 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  h pseudo-table..
21a30 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72        ** For a r
21a40 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
21a50 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20  other column in 
21a60 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f  the new.* pseudo
21a70 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20  -table, p1.     
21a80 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e   ** is set to (n
21a90 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61  +2+i), where n a
21aa0 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69  nd i are as defi
21ab0 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20  ned previously. 
21ac0 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61  For.      ** exa
21ad0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62  mple, if the tab
21ae0 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67  le on which trig
21af0 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66  gers are being f
21b00 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a  ired is.      **
21b10 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20   declared as:.  
21b20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21b30 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
21b40 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a  1(a, b);.      *
21b50 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  *.      ** Then 
21b60 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  p1 is interprete
21b70 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
21b80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21b90 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20    p1==0   ->    
21ba0 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31  old.rowid     p1
21bb0 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==3   ->    new.
21bc0 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20  rowid.      **  
21bd0 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f   p1==1   ->    o
21be0 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d  ld.a         p1=
21bf0 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61  =4   ->    new.a
21c00 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
21c10 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20  2   ->    old.b 
21c20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20          p1==5   
21c30 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20  ->    new.b     
21c40 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
21c50 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
21c60 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
21c70 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70     int p1 = pExp
21c80 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61  r->iTable * (pTa
21c90 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b  b->nCol+1) + 1 +
21ca0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
21cb0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
21cc0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
21cd0 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
21ce0 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73  e==1 );.      as
21cf0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
21d00 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70  lumn>=-1 && pExp
21d10 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d  r->iColumn<pTab-
21d20 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61  >nCol );.      a
21d30 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b  ssert( pTab->iPK
21d40 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  ey<0 || pExpr->i
21d50 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50  Column!=pTab->iP
21d60 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Key );.      ass
21d70 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31  ert( p1>=0 && p1
21d80 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32  <(pTab->nCol*2+2
21d90 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ) );..      sqli
21da0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21db0 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74   OP_Param, p1, t
21dc0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64  arget);.      Vd
21dd0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
21de0 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20  s.%s -> $%d",.  
21df0 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54        (pExpr->iT
21e00 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22  able ? "new" : "
21e10 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28  old"),.        (
21e20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
21e30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78   ? "rowid" : pEx
21e40 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  pr->pTab->aCol[p
21e50 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a  Expr->iColumn].z
21e60 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74  Name),.        t
21e70 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a  arget.      ));.
21e80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21e90 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
21ea0 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  INT.      /* If 
21eb0 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52  the column has R
21ec0 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74  EAL affinity, it
21ed0 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62   may currently b
21ee0 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20  e stored as an. 
21ef0 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e       ** integer.
21f00 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69   Use OP_RealAffi
21f10 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72  nity to make sur
21f20 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  e it is really r
21f30 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eal..      **.  
21f40 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
21f50 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36  OF: R-60985-5766
21f60 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f  2 SQLite will co
21f70 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20  nvert the value 
21f80 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a  back to.      **
21f90 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
21fa0 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20  when extracting 
21fb0 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f  it from the reco
21fc0 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  rd.  */.      if
21fd0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
21fe0 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  >=0 .       && p
21ff0 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
22000 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  >iColumn].affini
22010 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
22020 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  EAL.      ){.   
22030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22040 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61  AddOp1(v, OP_Rea
22050 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65  lAffinity, targe
22060 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
22070 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
22080 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
22090 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20  TK_VECTOR: {.   
220a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
220b0 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20  sg(pParse, "row 
220c0 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b  value misused");
220d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
220e0 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
220f0 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a  _IF_NULL_ROW: {.
22100 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e        int addrIN
22110 52 3b 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52  R;.      addrINR
22120 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
22130 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c  dOp1(v, OP_IfNul
22140 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61  lRow, pExpr->iTa
22150 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ble);.      sqli
22160 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
22170 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
22180 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
22190 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
221a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
221b0 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
221c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
221d0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
221e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
221f0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
22200 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73 71 6c  rINR);.      sql
22210 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
22220 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69 6e 52  (v, addrINR, inR
22230 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
22240 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
22250 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20      ** Form A:. 
22260 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57     **   CASE x W
22270 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
22280 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
22290 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
222a0 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
222b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
222c0 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   B:.    **   CAS
222d0 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  E WHEN e1 THEN r
222e0 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
222f0 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
22300 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
22310 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
22320 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20  orm A is can be 
22330 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
22340 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
22350 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77  form B as follow
22360 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  s:.    **   CASE
22370 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20   WHEN x=e1 THEN 
22380 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45  r1 WHEN x=e2 THE
22390 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20  N r2 ....    ** 
223a0 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e         WHEN x=eN
223b0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
223c0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
223d0 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74  * X (if it exist
223e0 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  s) is in pExpr->
223f0 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
22400 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65  is in the last e
22410 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d  lement of pExpr-
22420 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70  >x.pList if pExp
22430 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
22440 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e  r is.    ** odd.
22450 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20    The Y is also 
22460 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68  optional.  If th
22470 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
22480 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a  ents in x.pList.
22490 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20      ** is even, 
224a0 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65  then Y is omitte
224b0 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72  d and the "other
224c0 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73 20  wise" result is 
224d0 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20  NULL..    ** Ei 
224e0 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  is in pExpr->pLi
224f0 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52  st->a[i*2] and R
22500 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73  i is pExpr->pLis
22510 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20  t->a[i*2+1]..   
22520 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
22530 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
22540 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52  ression is the R
22550 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  i for the first 
22560 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20  matching Ei,.   
22570 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20   ** or if there 
22580 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45  is no matching E
22590 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d  i, the ELSE term
225a0 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20   Y, or if there 
225b0 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53  is.    ** no ELS
225c0 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20  E term, NULL..  
225d0 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
225e0 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b  : assert( op==TK
225f0 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20  _CASE ); {.     
22600 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20   int endLabel;  
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22620 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
22630 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45   for end of CASE
22640 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69   stmt */.      i
22650 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20  nt nextCase;    
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22670 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
22680 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61  or next WHEN cla
22690 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
226a0 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20   nExpr;         
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
226c0 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57  * 2x number of W
226d0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
226e0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22700 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
22710 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  nter */.      Ex
22720 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22740 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20  /* List of WHEN 
22750 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73  terms */.      s
22760 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
22770 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20  tem *aListelem; 
22780 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45   /* Array of WHE
22790 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
227a0 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b   Expr opCompare;
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20     /* The X==Ei 
227d0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
227e0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22800 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65        /* The X e
22810 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
22820 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d     Expr *pTest =
22830 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
22840 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66       /* X==Ei (f
22850 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45  orm A) or just E
22860 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20  i (form B) */.  
22870 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e      VVA_ONLY( in
22880 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20  t iCacheLevel = 
22890 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
228a0 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73  vel; )..      as
228b0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
228c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
228d0 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70  _xIsSelect) && p
228e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b  Expr->x.pList );
228f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
22900 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
22910 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
22920 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
22930 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
22940 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
22950 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
22960 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
22970 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
22980 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
22990 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
229a0 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78     if( (pX = pEx
229b0 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
229c0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d  .        tempX =
229d0 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65   *pX;.        te
229e0 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
229f0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
22a00 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73       exprToRegis
22a10 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78 70 72  ter(&tempX, expr
22a20 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
22a30 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46  e, &tempX, &regF
22a40 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ree1));.        
22a50 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
22a60 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
22a70 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61   memset(&opCompa
22a80 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70  re, 0, sizeof(op
22a90 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20 20 20  Compare));.     
22aa0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20     opCompare.op 
22ab0 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20  = TK_EQ;.       
22ac0 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74   opCompare.pLeft
22ad0 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20   = &tempX;.     
22ae0 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
22af0 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f  mpare;.        /
22b00 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35  * Ticket b351d95
22b10 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61  f9cd5ef17e9d9dba
22b20 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30  e18f5ca861119000
22b30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  1:.        ** Th
22b40 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72  e value in regFr
22b50 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43  ee1 might get SC
22b60 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20  opy-ed into the 
22b70 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20  file result..   
22b80 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20       ** So make 
22b90 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
22ba0 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20  gFree1 register 
22bb0 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f  is not reused fo
22bc0 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  r other.        
22bd0 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20  ** purposes and 
22be0 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69  possibly overwri
22bf0 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  tten.  */.      
22c00 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a    regFree1 = 0;.
22c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
22c20 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31  r(i=0; i<nExpr-1
22c30 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
22c40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
22c50 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
22c60 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
22c70 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
22c80 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a  rt( pTest!=0 );.
22c90 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
22ca0 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
22cb0 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
22cc0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
22cd0 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
22ce0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
22cf0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
22d00 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
22d10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
22d20 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
22d30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
22d40 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
22d50 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
22d60 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
22d70 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20  (pParse, pTest, 
22d80 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45  nextCase, SQLITE
22d90 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
22da0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22db0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
22dc0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
22dd0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
22de0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
22df0 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
22e00 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
22e10 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
22e20 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
22e30 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
22e40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22e50 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
22e60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22e70 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
22e80 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20  (v, nextCase);. 
22e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22ea0 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b   (nExpr&1)!=0 ){
22eb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22ec0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
22ed0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
22ee0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
22ef0 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
22f00 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c  [nExpr-1].pExpr,
22f10 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
22f20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
22f30 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
22f40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22f50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22f60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
22f70 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
22f80 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
22f90 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
22fa0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
22fb0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a  pParse->nErr>0 .
22fc0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
22fd0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
22fe0 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29  l==iCacheLevel )
22ff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
23000 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
23010 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
23020 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
23030 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23040 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
23050 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
23060 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23070 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
23080 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20  =OE_Rollback .  
23090 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
230a0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
230b0 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20  Abort.          
230c0 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
230d0 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20  ity==OE_Fail.   
230e0 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
230f0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
23100 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20  gnore.      );. 
23110 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
23120 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b  ->pTriggerTab ){
23130 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23140 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
23150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23160 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29          "RAISE()
23170 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
23180 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  d within a trigg
23190 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  er-program");.  
231a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
231b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
231c0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
231d0 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  y==OE_Abort ){. 
231e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61         sqlite3Ma
231f0 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
23200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
23210 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
23220 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
23230 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
23240 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
23250 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
23260 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  re ){.        sq
23270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
23280 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20  .            v, 
23290 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
232a0 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30  OK, OE_Ignore, 0
232b0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
232c0 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  n,0);.        Vd
232d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
232e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
232f0 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43      sqlite3HaltC
23300 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
23310 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
23320 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20  INT_TRIGGER,.   
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23340 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
23350 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70  ->affinity, pExp
23360 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
23370 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
23380 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
23390 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
233a0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
233b0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
233c0 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
233d0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
233e0 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
233f0 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b  .  return inReg;
23400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72  .}../*.** Factor
23410 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66   out the code of
23420 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
23430 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c  ssion to initial
23440 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a  ization time..**
23450 0a 2a 2a 20 49 66 20 72 65 67 44 65 73 74 3e 3d  .** If regDest>=
23460 30 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  0 then the resul
23470 74 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72  t is always stor
23480 65 64 20 69 6e 20 74 68 61 74 20 72 65 67 69 73  ed in that regis
23490 74 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72  ter and the.** r
234a0 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 72 65 75  esult is not reu
234b0 73 61 62 6c 65 2e 20 20 49 66 20 72 65 67 44 65  sable.  If regDe
234c0 73 74 3c 30 20 74 68 65 6e 20 74 68 69 73 20 72  st<0 then this r
234d0 6f 75 74 69 6e 65 20 69 73 20 66 72 65 65 20 74  outine is free t
234e0 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20  o .** store the 
234f0 76 61 6c 75 65 20 77 68 65 72 65 65 76 65 72 20  value whereever 
23500 69 74 20 77 61 6e 74 73 2e 20 20 54 68 65 20 72  it wants.  The r
23510 65 67 69 73 74 65 72 20 77 68 65 72 65 20 74 68  egister where th
23520 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a  e expression .**
23530 20 69 73 20 73 74 6f 72 65 64 20 69 73 20 72 65   is stored is re
23540 74 75 72 6e 65 64 2e 20 20 57 68 65 6e 20 72 65  turned.  When re
23550 67 44 65 73 74 3c 30 2c 20 74 77 6f 20 69 64 65  gDest<0, two ide
23560 6e 74 69 63 61 6c 20 65 78 70 72 65 73 73 69 6f  ntical expressio
23570 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20  ns will.** code 
23580 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65 67 69  to the same regi
23590 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ster..*/.int sql
235a0 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
235b0 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  it(.  Parse *pPa
235c0 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
235d0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
235e0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
235f0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
23600 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e  ion to code when
23610 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69 61   the VDBE initia
23620 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  lizes */.  int r
23630 65 67 44 65 73 74 20 20 20 20 20 20 20 2f 2a 20  egDest       /* 
23640 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  Store the value 
23650 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
23660 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
23670 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t *p;.  assert( 
23680 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
23690 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70  arse) );.  p = p
236a0 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
236b0 72 3b 0a 20 20 69 66 28 20 72 65 67 44 65 73 74  r;.  if( regDest
236c0 3c 30 20 26 26 20 70 20 29 7b 0a 20 20 20 20 73  <0 && p ){.    s
236d0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
236e0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
236f0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 70  int i;.    for(p
23700 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e  Item=p->a, i=p->
23710 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65  nExpr; i>0; pIte
23720 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20  m++, i--){.     
23730 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73   if( pItem->reus
23740 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45  able && sqlite3E
23750 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d  xprCompare(pItem
23760 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31  ->pExpr,pExpr,-1
23770 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23780 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e  return pItem->u.
23790 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20  iConstExprReg;. 
237a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
237b0 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
237c0 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
237d0 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
237e0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
237f0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
23800 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a  rse, p, pExpr);.
23810 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
23820 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23830 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
23840 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b  ->a[p->nExpr-1];
23850 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75  .     pItem->reu
23860 73 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c  sable = regDest<
23870 30 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67 44  0;.     if( regD
23880 65 73 74 3c 30 20 29 20 72 65 67 44 65 73 74 20  est<0 ) regDest 
23890 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
238a0 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e  ;.     pItem->u.
238b0 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20  iConstExprReg = 
238c0 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70  regDest;.  }.  p
238d0 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
238e0 72 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20  r = p;.  return 
238f0 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  regDest;.}../*.*
23900 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
23910 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
23920 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
23930 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
23940 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
23950 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
23960 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
23970 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
23980 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
23990 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
239a0 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
239b0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
239c0 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
239d0 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
239e0 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
239f0 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
23a00 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
23a10 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
23a20 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
23a30 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
23a40 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  ro..**.** If pEx
23a50 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
23a60 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
23a70 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61  ine might genera
23a80 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20  te this.** code 
23a90 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69  to fill the regi
23aa0 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74  ster in the init
23ab0 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69  ialization secti
23ac0 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42  on of the.** VDB
23ad0 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72  E program, in or
23ae0 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74  der to factor it
23af0 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c   out of the eval
23b00 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a  uation loop..*/.
23b10 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
23b20 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70  odeTemp(Parse *p
23b30 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
23b40 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a  pr, int *pReg){.
23b50 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70    int r2;.  pExp
23b60 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
23b70 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
23b80 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61  );.  if( ConstFa
23b90 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20  ctorOk(pParse). 
23ba0 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d    && pExpr->op!=
23bb0 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26  TK_REGISTER.   &
23bc0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
23bd0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
23be0 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a  Expr).  ){.    *
23bf0 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72  pReg  = 0;.    r
23c00 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
23c10 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
23c20 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20  , pExpr, -1);.  
23c30 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
23c40 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
23c50 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
23c60 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
23c70 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
23c80 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
23c90 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
23ca0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
23cb0 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
23cc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
23cd0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
23ce0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
23cf0 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
23d00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
23d10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
23d20 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
23d30 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
23d40 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
23d50 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
23d60 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
23d70 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
23d80 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
23d90 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
23da0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
23db0 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  arget..*/.void s
23dc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
23dd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
23de0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
23df0 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
23e00 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
23e10 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
23e20 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
23e30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
23e40 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
23e50 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
23e60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23e70 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
23e80 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
23e90 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
23ea0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23eb0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
23ec0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
23ed0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
23ee0 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
23ef0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
23f00 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
23f10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23f20 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
23f30 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
23f40 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
23f50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23f60 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
23f70 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
23f80 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
23f90 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
23fa0 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74  Make a transient
23fb0 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
23fc0 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68  ion pExpr and th
23fd0 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67  en code it using
23fe0 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43  .** sqlite3ExprC
23ff0 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75  ode().  This rou
24000 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20  tine works just 
24010 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
24020 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74  Code().** except
24030 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
24040 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75  expression is gu
24050 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75  aranteed to be u
24060 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
24070 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
24080 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  eCopy(Parse *pPa
24090 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
240a0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
240b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
240c0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78  Parse->db;.  pEx
240d0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
240e0 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
240f0 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  );.  if( !db->ma
24100 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c  llocFailed ) sql
24110 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
24120 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
24130 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  et);.  sqlite3Ex
24140 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
24150 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  pr);.}../*.** Ge
24160 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
24170 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
24180 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
24190 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
241a0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
241b0 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
241c0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
241d0 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
241e0 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
241f0 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68  r target.  If th
24200 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
24210 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
24220 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
24230 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63  ight choose to c
24240 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ode the expressi
24250 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61  on at initializa
24260 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
24270 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
24280 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72  deFactorable(Par
24290 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
242a0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
242b0 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72  get){.  if( pPar
242c0 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
242d0 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  r && sqlite3Expr
242e0 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
242f0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
24300 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
24310 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
24320 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
24330 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
24340 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
24350 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a  r, target);.  }.
24360 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
24370 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
24380 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  uates the given 
24390 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
243a0 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
243b0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
243c0 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rget..**.** Also
243d0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
243e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
243f0 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74  esults into anot
24400 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69  her "cache" regi
24410 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69  ster.** and modi
24420 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
24430 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  n so that the ne
24440 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76  xt time it is ev
24450 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  aluated,.** the 
24460 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79  result is a copy
24470 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65   of the cache re
24480 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
24490 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
244a0 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ed for expressio
244b0 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ns that are used
244c0 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
244d0 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65  mes.  They are e
244e0 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e  valuated once an
244f0 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
24500 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
24510 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a  ** are reused..*
24520 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
24530 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
24540 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
24550 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
24560 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
24570 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
24580 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a  e;.  int iMem;..
24590 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
245a0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
245b0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
245c0 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69  GISTER );.  sqli
245d0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
245e0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
245f0 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  t);.  iMem = ++p
24600 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
24610 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24620 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72  (v, OP_Copy, tar
24630 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78  get, iMem);.  ex
24640 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78  prToRegister(pEx
24650 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a  pr, iMem);.}../*
24660 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
24670 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
24680 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
24690 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
246a0 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
246b0 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
246c0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
246d0 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
246e0 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
246f0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
24700 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
24710 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  valuated..**.** 
24720 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
24730 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74  DUP flag prevent
24740 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
24750 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69  from being.** fi
24760 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43  lled using OP_SC
24770 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75  opy.  OP_Copy mu
24780 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  st be used inste
24790 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ad..**.** The SQ
247a0 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
247b0 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73   argument allows
247c0 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
247d0 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63  nts to be.** fac
247e0 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69  tored out into i
247f0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
24800 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  de..**.** The SQ
24810 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c  LITE_ECEL_REF fl
24820 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78  ag means that ex
24830 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
24840 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78   list with.** Ex
24850 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69  prList.a[].u.x.i
24860 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76  OrderByCol>0 hav
24870 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
24880 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f  valuated and sto
24890 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  red.** in regist
248a0 65 72 73 20 61 74 20 73 72 63 52 65 67 2c 20 61  ers at srcReg, a
248b0 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20  nd so the value 
248c0 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72  can be copied fr
248d0 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74  om there..*/.int
248e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
248f0 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
24900 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
24910 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
24920 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
24930 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
24940 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
24950 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
24960 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
24970 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
24980 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
24990 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20  /.  int srcReg, 
249a0 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
249b0 20 72 65 67 69 73 74 65 72 73 20 69 66 20 53 51   registers if SQ
249c0 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f  LITE_ECEL_REF */
249d0 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20  .  u8 flags     
249e0 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
249f0 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  ECEL_* flags */.
24a00 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
24a10 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
24a20 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
24a30 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
24a40 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
24a50 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
24a60 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
24a70 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
24a80 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
24a90 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
24aa0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
24ab0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
24ac0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
24ad0 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65   );  /* Never ge
24ae0 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65  ts this far othe
24af0 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70  rwise */.  n = p
24b00 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
24b10 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f  f( !ConstFactorO
24b20 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67  k(pParse) ) flag
24b30 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45  s &= ~SQLITE_ECE
24b40 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28  L_FACTOR;.  for(
24b50 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
24b60 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
24b70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
24b80 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d  r *pExpr = pItem
24b90 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->pExpr;.    if(
24ba0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
24bb0 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26  _ECEL_REF)!=0 &&
24bc0 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78   (j = pItem->u.x
24bd0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20  .iOrderByCol)>0 
24be0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ){.      if( fla
24bf0 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
24c00 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20 20 20 20  _OMITREF ){.    
24c10 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20      i--;.       
24c20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73   n--;.      }els
24c30 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
24c40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24c50 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67  copyOp, j+srcReg
24c60 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  -1, target+i);. 
24c70 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
24c80 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
24c90 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
24ca0 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45  )!=0 && sqlite3E
24cb0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
24cc0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  xpr) ){.      sq
24cd0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
24ce0 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
24cf0 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
24d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
24d10 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  nt inReg = sqlit
24d20 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
24d30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24d40 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
24d50 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
24d60 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20  et+i ){.        
24d70 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
24d80 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d       if( copyOp=
24d90 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
24da0 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65    && (pOp=sqlite
24db0 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31  3VdbeGetOp(v, -1
24dc0 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  ))->opcode==OP_C
24dd0 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
24de0 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b  pOp->p1+pOp->p3+
24df0 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20  1==inReg.       
24e00 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70    && pOp->p2+pOp
24e10 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69  ->p3+1==target+i
24e20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
24e30 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b        pOp->p3++;
24e40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
24e50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24e60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
24e70 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61  opyOp, inReg, ta
24e80 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20  rget+i);.       
24e90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24ea0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
24eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
24ec0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  te code for a BE
24ed0 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  TWEEN operator..
24ee0 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45  **.**    x BETWE
24ef0 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a  EN y AND z.**.**
24f00 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65 71   The above is eq
24f10 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a  uivalent to .**.
24f20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
24f30 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69  <=z.**.** Code i
24f40 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e  t as such, takin
24f50 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65  g care to do the
24f60 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65   common subexpre
24f70 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61  ssion.** elimina
24f80 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a  tion of x..**.**
24f90 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70 61 72   The xJumpIf par
24fa0 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
24fb0 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a  s details:.**.**
24fc0 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20 20      NULL:       
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72              Stor
24fe0 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  e the boolean re
24ff0 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65 73 74  sult in reg[dest
25000 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45  ].**    sqlite3E
25010 78 70 72 49 66 54 72 75 65 3a 20 20 20 20 20 20  xprIfTrue:      
25020 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20  Jump to dest if 
25030 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69 74  true.**    sqlit
25040 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a 20 20  e3ExprIfFalse:  
25050 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20     Jump to dest 
25060 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54  if false.**.** T
25070 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70 61  he jumpIfNull pa
25080 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72  rameter is ignor
25090 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20 69 73  ed if xJumpIf is
250a0 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
250b0 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65   void exprCodeBe
250c0 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  tween(.  Parse *
250d0 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
250e0 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
250f0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
25100 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
25110 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  pr,      /* The 
25120 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69  BETWEEN expressi
25130 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
25140 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ,         /* Jum
25150 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 72  p destination or
25160 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74 69 6f   storage locatio
25170 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4a  n */.  void (*xJ
25180 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78 70 72  ump)(Parse*,Expr
25190 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20 41  *,int,int), /* A
251a0 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a 2f  ction to take */
251b0 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
251c0 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65  l    /* Take the
251d0 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54   jump if the BET
251e0 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a  WEEN is NULL */.
251f0 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41 6e 64  ){. Expr exprAnd
25200 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44  ;     /* The AND
25210 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e   operator in  x>
25220 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a  =y AND x<=z  */.
25230 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b    Expr compLeft;
25240 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79      /* The  x>=y
25250 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
25260 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a   compRight;   /*
25270 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d   The  x<=z  term
25280 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58   */.  Expr exprX
25290 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20  ;       /* The  
252a0 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  x  subexpression
252b0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
252c0 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f  e1 = 0; /* Tempo
252d0 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65  rary use registe
252e0 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65 74 28  r */...  memset(
252f0 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73 69  &compLeft, 0, si
25300 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d  zeof(Expr));.  m
25310 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68 74  emset(&compRight
25320 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
25330 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 78  ));.  memset(&ex
25340 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f 66  prAnd, 0, sizeof
25350 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73 65  (Expr));..  asse
25360 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
25370 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
25380 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65  IsSelect) );.  e
25390 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70  xprX = *pExpr->p
253a0 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e  Left;.  exprAnd.
253b0 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65  op = TK_AND;.  e
253c0 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26  xprAnd.pLeft = &
253d0 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  compLeft;.  expr
253e0 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f  And.pRight = &co
253f0 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c  mpRight;.  compL
25400 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a  eft.op = TK_GE;.
25410 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74    compLeft.pLeft
25420 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d   = &exprX;.  com
25430 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70  pLeft.pRight = p
25440 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
25450 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d  [0].pExpr;.  com
25460 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c  pRight.op = TK_L
25470 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  E;.  compRight.p
25480 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
25490 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68   compRight.pRigh
254a0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
254b0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
254c0 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
254d0 28 26 65 78 70 72 58 2c 20 65 78 70 72 43 6f 64  (&exprX, exprCod
254e0 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
254f0 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65  &exprX, &regFree
25500 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70  1));.  if( xJump
25510 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28 70 50   ){.    xJump(pP
25520 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
25530 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
25540 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25550 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65 78 70 72  /* Mark the expr
25560 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  ession is being 
25570 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55  from the ON or U
25580 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
25590 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 20   join.    ** so 
255a0 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
255b0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 29  ExprCodeTarget()
255c0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f   routine will no
255d0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76  t attempt to mov
255e0 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  e.    ** it into
255f0 20 74 68 65 20 50 61 72 73 65 2e 70 43 6f 6e 73   the Parse.pCons
25600 74 45 78 70 72 20 6c 69 73 74 2e 20 20 57 65 20  tExpr list.  We 
25610 73 68 6f 75 6c 64 20 75 73 65 20 61 20 6e 65 77  should use a new
25620 20 62 69 74 20 66 6f 72 20 74 68 69 73 2c 0a 20   bit for this,. 
25630 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74     ** for clarit
25640 79 2c 20 62 75 74 20 77 65 20 61 72 65 20 6f 75  y, but we are ou
25650 74 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  t of bits in the
25660 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c   Expr.flags fiel
25670 64 20 73 6f 20 77 65 0a 20 20 20 20 2a 2a 20 68  d so we.    ** h
25680 61 76 65 20 74 6f 20 72 65 75 73 65 20 74 68 65  ave to reuse the
25690 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74   EP_FromJoin bit
256a0 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20  .  Bummer. */.  
256b0 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d    exprX.flags |=
256c0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
256d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
256e0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
256f0 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b  &exprAnd, dest);
25700 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
25710 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
25720 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
25730 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
25740 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
25750 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
25760 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
25770 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
25780 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
25790 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
257a0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
257b0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
257c0 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
257d0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
257e0 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
257f0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
25800 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
25810 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
25820 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
25830 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
25840 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
25850 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
25860 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
25870 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
25880 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
25890 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
258a0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
258b0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
258c0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
258d0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
258e0 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
258f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
25900 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
25910 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
25920 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
25930 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
25940 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
25950 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
25960 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
25970 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
25980 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
25990 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
259a0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
259b0 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
259c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
259d0 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
259e0 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
259f0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
25a00 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
25a10 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
25a20 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
25a30 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
25a40 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
25a50 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
25a60 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
25a70 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
25a80 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
25a90 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
25aa0 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
25ab0 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
25ac0 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
25ad0 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
25ae0 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
25af0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
25b00 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
25b10 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
25b20 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
25b30 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
25b40 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
25b50 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
25b60 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
25b70 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
25b80 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
25b90 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
25ba0 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
25bb0 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
25bc0 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
25bd0 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
25be0 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
25bf0 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
25c00 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
25c10 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
25c20 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
25c30 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
25c40 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
25c50 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
25c60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
25c70 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
25c80 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
25c90 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
25ca0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
25cb0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
25cc0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
25cd0 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
25ce0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
25cf0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
25d00 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
25d10 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
25d20 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
25d30 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
25d40 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
25d50 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
25d60 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
25d70 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
25d80 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
25d90 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ler */.  if( NEV
25da0 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72  ER(pExpr==0) ) r
25db0 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61  eturn;  /* No wa
25dc0 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
25dd0 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70  n */.  op = pExp
25de0 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
25df0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
25e00 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
25e10 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
25e20 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
25e30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
25e40 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
25e50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25e60 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
25e70 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
25e80 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e  , d2,jumpIfNull^
25e90 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
25ea0 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
25eb0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
25ec0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
25ed0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
25ee0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
25ef0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
25f00 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
25f10 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
25f20 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
25f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25f40 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
25f50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
25f60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
25f70 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_OR: {.      te
25f80 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
25f90 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
25fa0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
25fb0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25fc0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
25fd0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
25fe0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
25ff0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
26000 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26010 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26020 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
26030 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26040 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26050 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
26060 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
26070 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
26080 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
26090 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
260a0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
260b0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
260c0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
260d0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
260e0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
260f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26100 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
26110 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
26120 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
26130 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
26140 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
26150 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
26160 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
26170 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
26180 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_NE;.      jum
26190 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
261a0 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
261b0 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
261c0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
261d0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
261e0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
261f0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
26200 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
26210 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
26220 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
26230 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
26240 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
26250 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
26260 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26270 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26280 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
26290 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
262a0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
262b0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
262c0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
262d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
262e0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
262f0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
26300 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
26310 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
26320 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
26330 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
26340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26350 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
26360 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
26370 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
26380 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
26390 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
263a0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
263b0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
263c0 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
263d0 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
263e0 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
263f0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
26400 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
26410 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
26420 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
26430 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
26440 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
26450 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
26460 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
26470 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
26480 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
26490 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
264a0 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
264b0 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
264c0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
264d0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
264e0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
264f0 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
26500 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
26510 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
26520 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
26530 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
26540 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
26550 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
26560 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
26570 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
26580 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
26590 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
265a0 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
265b0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
265c0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
265d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
265e0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
265f0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
26600 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
26610 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
26620 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
26630 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
26640 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
26650 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
26660 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
26670 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
26680 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
26690 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
266a0 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
266b0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
266c0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
266d0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
266e0 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
266f0 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
26700 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
26710 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
26720 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
26730 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26740 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
26750 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26760 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
26770 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
26780 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26790 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
267a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
267b0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
267c0 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
267d0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
267e0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
267f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
26800 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
26810 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
26820 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
26830 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
26840 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
26850 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
26860 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
26870 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
26880 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26890 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
268a0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
268b0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
268c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
268d0 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
268e0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
268f0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
26900 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
26910 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
26920 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
26930 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
26940 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
26950 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
26960 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
26970 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
26980 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
26990 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
269a0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
269b0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
269c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
269d0 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
269e0 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
269f0 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20  expr:.      if( 
26a00 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
26a10 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
26a20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
26a30 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
26a40 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
26a50 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
26a60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
26a70 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  No-op */.      }
26a80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
26a90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
26aa0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
26ab0 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
26ac0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
26ad0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
26ae0 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
26af0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
26b00 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
26b10 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
26b20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
26b30 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
26b40 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26b50 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26b60 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
26b70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
26b80 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
26b90 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
26ba0 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
26bb0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
26bc0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
26bd0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
26be0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
26bf0 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
26c00 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
26c10 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
26c20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
26c30 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
26c40 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
26c50 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
26c60 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
26c70 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
26c80 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
26c90 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
26ca0 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
26cb0 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
26cc0 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
26cd0 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
26ce0 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
26cf0 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
26d00 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
26d10 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
26d20 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
26d30 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
26d40 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
26d50 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
26d60 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
26d70 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
26d80 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
26d90 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
26da0 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
26db0 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
26dc0 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
26dd0 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
26de0 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
26df0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
26e00 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
26e10 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
26e20 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
26e30 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65  eturn; /* Existe
26e40 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
26e50 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
26e60 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
26e70 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
26e80 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
26e90 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
26ea0 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
26eb0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
26ec0 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
26ed0 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
26ee0 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
26ef0 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
26f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
26f10 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
26f20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
26f30 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
26f40 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
26f50 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
26f60 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
26f70 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
26f80 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
26f90 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
26fa0 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
26fb0 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
26fc0 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
26fd0 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
26fe0 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
26ff0 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
27000 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
27010 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
27030 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
27040 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
27050 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
27060 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
27070 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
27080 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
27090 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
270a0 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
270b0 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
270c0 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
270d0 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
270e0 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
270f0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
27100 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
27110 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
27120 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
27130 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
27140 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
27150 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
27160 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
27170 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
27180 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
27190 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
271a0 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
271b0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
271c0 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
271d0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
271e0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
271f0 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
27200 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
27210 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
27220 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
27230 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
27240 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27250 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
27260 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
27270 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27280 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
27290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
272a0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
272b0 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
272c0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
272d0 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
272e0 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
272f0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
27300 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
27310 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
27320 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
27330 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
27340 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
27350 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
27360 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27370 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
27380 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
27390 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
273a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
273b0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
273c0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
273d0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
273e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
273f0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
27400 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
27410 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
27420 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
27430 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
27440 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
27450 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
27460 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
27470 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
27480 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27490 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
274a0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
274b0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
274c0 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70  >pLeft, d2, jump
274d0 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
274e0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
274f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
27500 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
27510 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27520 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
27530 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
27540 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
27550 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27560 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
27570 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
27580 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
27590 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
275a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
275b0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
275c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
275d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
275e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
275f0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
27600 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
27610 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
27620 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
27630 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
27640 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
27650 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
27660 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
27670 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
27680 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
27690 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
276a0 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
276b0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
276c0 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
276d0 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  Q;.      jumpIfN
276e0 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
276f0 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
27700 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
27710 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
27720 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
27730 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
27740 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
27750 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
27760 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
27770 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
27780 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
27790 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
277a0 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
277b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
277c0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
277d0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
277e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
277f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27800 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
27810 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
27820 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
27830 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
27840 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
27850 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
27860 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
27870 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
27880 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
27890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
278a0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
278b0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
278c0 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
278d0 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
278e0 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
278f0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
27900 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
27910 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
27920 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
27930 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
27940 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
27950 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
27960 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
27970 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
27980 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
27990 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
279a0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
279b0 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
279c0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
279d0 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
279e0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
279f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
27a00 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
27a10 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
27a20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27a30 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
27a40 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
27a50 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
27a60 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
27a70 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
27a80 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
27a90 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
27aa0 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
27ab0 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
27ac0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
27ad0 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
27ae0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
27af0 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
27b00 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
27b10 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
27b20 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27b30 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
27b40 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
27b50 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
27b60 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
27b70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
27b80 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
27b90 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
27ba0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
27bb0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
27bc0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
27bd0 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
27be0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
27bf0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
27c00 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
27c10 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
27c20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
27c30 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
27c40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
27c50 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20  p==TK_ISNULL ); 
27c60 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27c70 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
27c80 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
27c90 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
27ca0 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LL );  VdbeCover
27cb0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
27cc0 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
27cd0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
27ce0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
27cf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27d00 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
27d10 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
27d20 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27d30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
27d40 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
27d50 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
27d60 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
27d70 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
27d80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27d90 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
27da0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
27db0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
27dc0 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
27dd0 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
27de0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
27df0 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
27e00 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
27e10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27e20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
27e30 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
27e40 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
27e50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
27e60 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
27e70 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
27e80 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
27e90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
27ea0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
27eb0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
27ec0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
27ed0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
27ee0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
27ef0 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20  default_expr: . 
27f00 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
27f10 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
27f20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27f30 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
27f40 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
27f50 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
27f60 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
27f70 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
27f80 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
27f90 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
27fa0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
27fb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
27fc0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
27fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27fe0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
27ff0 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
28000 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
28010 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28020 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
28030 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
28040 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
28050 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
28060 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
28070 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
28080 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
28090 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
280a0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
280b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
280c0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
280d0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
280e0 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
280f0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29  te3ExprIfFalse()
28100 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63   except that a c
28110 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70  opy is made of p
28120 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63  Expr before.** c
28130 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20  ode generation, 
28140 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73  and that copy is
28150 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63   deleted after c
28160 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
28170 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20  This.** ensures 
28180 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
28190 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61  l pExpr is uncha
281a0 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
281b0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
281c0 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Dup(Parse *pPars
281d0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
281e0 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d  int dest,int jum
281f0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69  pIfNull){.  sqli
28200 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
28210 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43  ->db;.  Expr *pC
28220 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
28230 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
28240 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
28250 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
28260 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
28270 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
28280 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d  pCopy, dest, jum
28290 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
282a0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
282b0 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a  e(db, pCopy);.}.
282c0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
282d0 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
282e0 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
282f0 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
28300 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
28310 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
28320 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
28330 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
28340 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
28350 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
28360 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
28370 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
28380 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
28390 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
283a0 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
283b0 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
283c0 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
283d0 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
283e0 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
283f0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
28400 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
28410 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
28420 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
28430 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
28440 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
28450 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
28460 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
28470 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
28480 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
28490 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
284a0 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
284b0 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
284c0 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
284d0 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
284e0 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
284f0 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
28500 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
28510 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
28520 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
28530 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
28540 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
28550 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
28560 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
28570 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
28580 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
28590 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
285a0 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
285b0 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
285c0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
285d0 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
285e0 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
285f0 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
28600 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
28610 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
28620 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
28630 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
28640 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
28650 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
28660 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
28670 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
28680 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
28690 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
286a0 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
286b0 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
286c0 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
286d0 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
286e0 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
286f0 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
28700 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
28710 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
28720 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
28730 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
28740 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
28750 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
28760 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
28770 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
28780 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46  .  u32 combinedF
28790 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d  lags;.  if( pA==
287a0 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20  0 || pB==0 ){.  
287b0 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20    return pB==pA 
287c0 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63  ? 0 : 2;.  }.  c
287d0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70  ombinedFlags = p
287e0 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66  A->flags | pB->f
287f0 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62  lags;.  if( comb
28800 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49  inedFlags & EP_I
28810 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
28820 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42  f( (pA->flags&pB
28830 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61  ->flags&EP_IntVa
28840 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75  lue)!=0 && pA->u
28850 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69  .iValue==pB->u.i
28860 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72  Value ){.      r
28870 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
28880 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
28890 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
288a0 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  B->op ){.    if(
288b0 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
288c0 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
288d0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
288e0 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32  eft, pB, iTab)<2
288f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
28900 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
28910 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
28920 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
28930 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70  xprCompare(pA, p
28940 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c  B->pLeft, iTab)<
28950 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
28960 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 1;.    }.    r
28970 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
28980 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  f( pA->op!=TK_CO
28990 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d  LUMN && pA->op!=
289a0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26  TK_AGG_COLUMN &&
289b0 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
289c0 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
289d0 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  =TK_FUNCTION ){.
289e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
289f0 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a  3StrICmp(pA->u.z
28a00 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
28a10 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  en)!=0 ) return 
28a20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
28a30 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54   strcmp(pA->u.zT
28a40 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
28a50 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
28a60 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b  eturn pA->op==TK
28a70 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32  _COLLATE ? 1 : 2
28a80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
28a90 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
28aa0 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
28ab0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
28ac0 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
28ad0 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  2;.  if( ALWAYS(
28ae0 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
28af0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d   EP_TokenOnly)==
28b00 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  0) ){.    if( co
28b10 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
28b20 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74  _xIsSelect ) ret
28b30 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
28b40 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
28b50 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
28b60 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20  >pLeft, iTab) ) 
28b70 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
28b80 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
28b90 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
28ba0 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pB->pRight, iTa
28bb0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
28bc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
28bd0 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41  prListCompare(pA
28be0 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78  ->x.pList, pB->x
28bf0 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20  .pList, iTab) ) 
28c00 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
28c10 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
28c20 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64  edFlags & EP_Red
28c30 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d  uced)==0) && pA-
28c40 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op!=TK_STRING )
28c50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  {.      if( pA->
28c60 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
28c70 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
28c80 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
28c90 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
28ca0 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41  e .       && (pA
28cb0 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
28cc0 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62  | NEVER(pB->iTab
28cd0 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e  le>=0)) ) return
28ce0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
28cf0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
28d00 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
28d10 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e  xprList objects.
28d20 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
28d30 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
28d40 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72   and .** non-zer
28d50 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  o if they differ
28d60 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
28d70 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
28d80 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
28d90 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
28da0 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
28db0 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
28dc0 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
28dd0 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
28de0 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
28df0 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
28e00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
28e10 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e  e might return n
28e20 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69  on-zero for equi
28e30 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73  valent ExprLists
28e40 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63  .  The.** only c
28e50 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  onsequence will 
28e60 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69  be disabled opti
28e70 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20  mizations.  But 
28e80 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
28e90 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72  must never retur
28ea0 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45  n 0 if the two E
28eb0 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20  xprList objects 
28ec0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f  are different, o
28ed0 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69  r.** a malfuncti
28ee0 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a  on will result..
28ef0 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70  **.** Two NULL p
28f00 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73  ointers are cons
28f10 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65  idered to be the
28f20 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55   same.  But a NU
28f30 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c  LL pointer.** al
28f40 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f  ways differs fro
28f50 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69  m a non-NULL poi
28f60 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
28f70 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
28f80 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41  are(ExprList *pA
28f90 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20  , ExprList *pB, 
28fa0 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74  int iTab){.  int
28fb0 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
28fc0 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  && pB==0 ) retur
28fd0 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  n 0;.  if( pA==0
28fe0 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75   || pB==0 ) retu
28ff0 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 1;.  if( pA->
29000 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72  nExpr!=pB->nExpr
29010 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
29020 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45  or(i=0; i<pA->nE
29030 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
29040 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
29050 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
29060 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d    Expr *pExprB =
29070 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pB->a[i].pExpr;
29080 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69  .    if( pA->a[i
29090 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d  ].sortOrder!=pB-
290a0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
290b0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
290c0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
290d0 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70  ompare(pExprA, p
290e0 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72  ExprB, iTab) ) r
290f0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
29100 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
29110 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  * Like sqlite3Ex
29120 70 72 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65  prCompare() exce
29130 70 74 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  pt COLLATE opera
29140 74 6f 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d  tors at the top-
29150 6c 65 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e  level.** are ign
29160 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ored..*/.int sql
29170 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53  ite3ExprCompareS
29180 6b 69 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78  kip(Expr *pA, Ex
29190 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
291a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
291b0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 0a  te3ExprCompare(.
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
291d0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
291e0 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20 20  ate(pA),.       
291f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29200 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42 29  rSkipCollate(pB)
29210 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
29220 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Tab);.}../*.** R
29230 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65  eturn true if we
29240 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70   can prove the p
29250 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  E2 will always b
29260 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73  e true if pE1 is
29270 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72  .** true.  Retur
29280 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61  n false if we ca
29290 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68  nnot complete th
292a0 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45  e proof or if pE
292b0 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61  2 might.** be fa
292c0 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  lse.  Examples:.
292d0 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  **.**     pE1: x
292e0 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78  ==5       pE2: x
292f0 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
29300 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
29310 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20      pE1: x>0    
29320 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
29330 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
29340 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
29350 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70  E1: x=21       p
29360 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33  E2: x=21 OR y=43
29370 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
29380 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
29390 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20  =123     pE2: x 
293a0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
293b0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
293c0 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20     pE1: x!=?1   
293d0 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
293e0 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
293f0 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
29400 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32  : x IS NULL  pE2
29410 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
29420 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
29430 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
29440 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49  S ?2    pE2: x I
29450 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
29460 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a  uslt: false.**.*
29470 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  * When comparing
29480 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
29490 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64   between pE1 and
294a0 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73   pE2, if pE2 has
294b0 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c  .** Expr.iTable<
294c0 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20  0 then assume a 
294d0 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76  table number giv
294e0 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a  en by iTab..**.*
294f0 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  * When in doubt,
29500 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20   return false.  
29510 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d  Returning true m
29520 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
29530 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f  ormance.** impro
29540 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  vement.  Returni
29550 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63  ng false might c
29560 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  ause a performan
29570 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75  ce reduction, bu
29580 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77  t.** it will alw
29590 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72  ays give the cor
295a0 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20  rect answer and 
295b0 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20  is hence always 
295c0 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  safe..*/.int sql
295d0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
295e0 78 70 72 28 45 78 70 72 20 2a 70 45 31 2c 20 45  xpr(Expr *pE1, E
295f0 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54  xpr *pE2, int iT
29600 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ab){.  if( sqlit
29610 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
29620 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30  1, pE2, iTab)==0
29630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
29640 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d  ;.  }.  if( pE2-
29650 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26  >op==TK_OR.   &&
29660 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70   (sqlite3ExprImp
29670 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45  liesExpr(pE1, pE
29680 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a  2->pLeft, iTab).
29690 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
296a0 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
296b0 65 73 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d  esExpr(pE1, pE2-
296c0 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
296d0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
296e0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
296f0 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  2->op==TK_NOTNUL
29700 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
29710 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
29720 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20  op!=TK_IS ){.   
29730 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69   Expr *pX = sqli
29740 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
29750 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a  te(pE1->pLeft);.
29760 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
29770 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a  !=pE1->pLeft );.
29780 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
29790 78 70 72 43 6f 6d 70 61 72 65 28 70 58 2c 20 70  xprCompare(pX, p
297a0 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
297b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
297c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
297d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  }../*.** An inst
297e0 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
297f0 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
29800 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  is used by the t
29810 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f  ree walker.** to
29820 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   determine if an
29830 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
29840 62 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20  be evaluated by 
29850 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
29860 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20  .** index only, 
29870 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
29880 6f 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f  o do a search fo
29890 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  r the correspond
298a0 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74  ing.** table ent
298b0 72 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65  ry.  The IdxCove
298c0 72 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20  r.pIdx field is 
298d0 74 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43  the index.  IdxC
298e0 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20  over.iCur.** is 
298f0 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74  the cursor for t
29900 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72  he table..*/.str
29910 75 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20  uct IdxCover {. 
29920 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
29930 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
29940 6f 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20  o be tested for 
29950 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e  coverage */.  in
29960 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f  t iCur;        /
29970 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
29980 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f  for the table co
29990 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
299a0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a  he index */.};..
299b0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
299c0 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
299d0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
299e0 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a  lumns in table .
299f0 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ** pWalker->u.pI
29a00 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61  dxCover->iCur ca
29a10 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75  n be satisfied u
29a20 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a  sing the index.*
29a30 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
29a40 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f  xCover->pIdx..*/
29a50 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
29a60 49 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20  IdxCover(Walker 
29a70 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
29a80 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
29a90 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
29aa0 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
29ab0 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d  iTable==pWalker-
29ac0 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43  >u.pIdxCover->iC
29ad0 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ur.   && sqlite3
29ae0 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57  ColumnOfIndex(pW
29af0 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
29b00 65 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d  er->pIdx, pExpr-
29b10 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b  >iColumn)<0.  ){
29b20 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
29b30 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  ode = 1;.    ret
29b40 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
29b50 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
29b60 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
29b70 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
29b80 61 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e  an index pIdx on
29b90 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
29ba0 6f 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  or iCur contains
29bb0 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70   will.** the exp
29bc0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
29bd0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
29be0 68 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f  he index does co
29bf0 76 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  ver the.** expre
29c00 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20  ssion and false 
29c10 69 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70  if the pExpr exp
29c20 72 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63  ression referenc
29c30 65 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  es table columns
29c40 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74  .** that are not
29c50 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e   found in the in
29c60 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
29c70 41 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e  An index coverin
29c80 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  g an expression 
29c90 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65  means that the e
29ca0 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
29cb0 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73  .** evaluated us
29cc0 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64  ing only the ind
29cd0 65 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68  ex and without h
29ce0 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20  aving to lookup 
29cf0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
29d00 64 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79  ding table entry
29d10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29d20 45 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64  ExprCoveredByInd
29d30 65 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ex(.  Expr *pExp
29d40 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
29d50 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73   index to be tes
29d60 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ted */.  int iCu
29d70 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
29d80 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
29d90 72 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  r for the corres
29da0 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f  ponding table */
29db0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
29dc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
29dd0 64 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62  dex that might b
29de0 65 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72  e used for cover
29df0 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b  age */.){.  Walk
29e00 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49  er w;.  struct I
29e10 64 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20  dxCover xcov;.  
29e20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
29e30 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76  zeof(w));.  xcov
29e40 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  .iCur = iCur;.  
29e50 78 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78  xcov.pIdx = pIdx
29e60 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
29e70 61 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76  ack = exprIdxCov
29e80 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f  er;.  w.u.pIdxCo
29e90 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73  ver = &xcov;.  s
29ea0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
29eb0 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74  w, pExpr);.  ret
29ec0 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a  urn !w.eCode;.}.
29ed0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
29ee0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
29ef0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
29f00 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
29f10 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
29f20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73  count references
29f30 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e   to table column
29f40 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  s in the argumen
29f50 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67  ts of an .** agg
29f60 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
29f70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70   in order to imp
29f80 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71  lement the.** sq
29f90 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69  lite3FunctionThi
29fa0 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a  sSrc() routine..
29fb0 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75  */.struct SrcCou
29fc0 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  nt {.  SrcList *
29fd0 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70  pSrc;   /* One p
29fe0 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63  articular FROM c
29ff0 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65  lause in a neste
2a000 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
2a010 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a   nThis;       /*
2a020 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
2a030 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2a040 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a   in pSrcList */.
2a050 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20    int nOther;   
2a060 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2a070 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
2a080 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46  lumns in other F
2a090 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d  ROM clauses */.}
2a0a0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ;../*.** Count t
2a0b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
2a0c0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2a0d0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
2a0e0 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57  t exprSrcCount(W
2a0f0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2a100 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2a110 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f  /* The NEVER() o
2a120 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72  n the second ter
2a130 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c  m is because sql
2a140 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
2a150 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69  ThisSrc().  ** i
2a160 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20  s always called 
2a170 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78  before sqlite3Ex
2a180 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2a190 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65  tes() and so the
2a1a0 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73  .  ** TK_COLUMNs
2a1b0 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65   have not yet be
2a1c0 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  en converted int
2a1d0 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e  o TK_AGG_COLUMN.
2a1e0 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65    If.  ** sqlite
2a1f0 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
2a200 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64  sSrc() is used d
2a210 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68  ifferently in th
2a220 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20  e future, the.  
2a230 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20  ** NEVER() will 
2a240 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76  need to be remov
2a250 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ed. */.  if( pEx
2a260 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
2a270 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72  N || NEVER(pExpr
2a280 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
2a290 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  UMN) ){.    int 
2a2a0 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  i;.    struct Sr
2a2b0 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c  cCount *p = pWal
2a2c0 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74  ker->u.pSrcCount
2a2d0 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  ;.    SrcList *p
2a2e0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
2a2f0 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53     int nSrc = pS
2a300 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20  rc ? pSrc->nSrc 
2a310 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  : 0;.    for(i=0
2a320 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  ; i<nSrc; i++){.
2a330 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2a340 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
2a350 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72  [i].iCursor ) br
2a360 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
2a370 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20  f( i<nSrc ){.   
2a380 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20     p->nThis++;. 
2a390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a3a0 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20  p->nOther++;.   
2a3b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2a3c0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2a3d0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
2a3e0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61   if any of the a
2a3f0 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
2a400 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72  pExpr Function r
2a410 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63  eference.** pSrc
2a420 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72  List.  Return tr
2a430 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20  ue if they do.  
2a440 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65  Also return true
2a450 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
2a460 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d  .** has no argum
2a470 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79  ents or has only
2a480 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
2a490 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  nts.  Return fal
2a4a0 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72  se if pExpr.** r
2a4b0 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e  eferences column
2a4c0 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e  s but not column
2a4d0 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e  s of tables foun
2a4e0 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a  d in pSrcList..*
2a4f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e  /.int sqlite3Fun
2a500 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
2a510 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72  (Expr *pExpr, Sr
2a520 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29  cList *pSrcList)
2a530 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2a540 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
2a550 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  cnt;.  assert( p
2a560 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
2a570 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77  _FUNCTION );.  w
2a580 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2a590 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20   exprSrcCount;. 
2a5a0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2a5b0 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53  ck = 0;.  w.u.pS
2a5c0 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a  rcCount = &cnt;.
2a5d0 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72    cnt.pSrc = pSr
2a5e0 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68  cList;.  cnt.nTh
2a5f0 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f  is = 0;.  cnt.nO
2a600 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ther = 0;.  sqli
2a610 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28  te3WalkExprList(
2a620 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  &w, pExpr->x.pLi
2a630 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e  st);.  return cn
2a640 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74  t.nThis>0 || cnt
2a650 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f  .nOther==0;.}../
2a660 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
2a670 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
2a680 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61  ggInfo->aCol[] a
2a690 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
2a6a0 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
2a6b0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
2a6c0 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
2a6d0 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
2a6e0 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
2a6f0 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
2a700 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33  foColumn(sqlite3
2a710 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
2a720 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
2a730 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20    pInfo->aCol = 
2a740 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
2a750 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
2a760 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
2a770 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  Col,.       size
2a780 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30  of(pInfo->aCol[0
2a790 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
2a7a0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  o->nColumn,.    
2a7b0 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
2a7c0 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
2a7d0 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
2a7e0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
2a7f0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61  gInfo->aFunc[] a
2a800 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
2a810 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
2a820 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
2a830 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
2a840 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
2a850 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
2a860 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
2a870 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a  foFunc(sqlite3 *
2a880 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
2a890 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
2a8a0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73  pInfo->aFunc = s
2a8b0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
2a8c0 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20  ate(.       db, 
2a8d0 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
2a8e0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a  Func,.       siz
2a8f0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  eof(pInfo->aFunc
2a900 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
2a910 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20  nfo->nFunc,.    
2a920 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
2a930 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
2a940 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
2a950 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f  xExprCallback fo
2a960 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e  r a tree walker.
2a970 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a    It is used to.
2a980 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c  ** implement sql
2a990 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2a9a0 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65  ggregates().  Se
2a9b0 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
2a9c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a  lyzeAggregates.*
2a9d0 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
2a9e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
2a9f0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
2aa00 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c  yzeAggregate(Wal
2aa10 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2aa20 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
2aa30 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
2aa40 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65  xt *pNC = pWalke
2aa50 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73  r->u.pNC;.  Pars
2aa60 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  e *pParse = pNC-
2aa70 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69  >pParse;.  SrcLi
2aa80 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
2aa90 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
2aaa0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2aab0 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  o = pNC->pAggInf
2aac0 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  o;..  switch( pE
2aad0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
2aae0 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
2aaf0 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
2ab00 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74  OLUMN: {.      t
2ab10 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2ab20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2ab30 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
2ab40 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2ab50 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
2ab60 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
2ab70 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ee if the column
2ab80 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68   is in one of th
2ab90 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
2aba0 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c  FROM.      ** cl
2abb0 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
2abc0 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20  egate query */. 
2abd0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
2abe0 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a  pSrcList!=0) ){.
2abf0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
2ac00 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2ac10 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
2ac20 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2ac30 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
2ac40 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
2ac50 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
2ac60 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
2ac70 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20   *pCol;.        
2ac80 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2ac90 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2aca0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2acb0 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2acc0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2acd0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
2ace0 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
2acf0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
2ad00 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
2ad10 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
2ad20 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
2ad30 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
2ad40 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
2ad50 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2ad60 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
2ad70 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
2ad80 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2ad90 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
2ada0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
2adb0 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
2adc0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
2add0 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
2ade0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
2adf0 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
2ae00 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
2ae10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2ae20 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
2ae30 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
2ae40 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
2ae50 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
2ae60 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2ae70 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
2ae80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2ae90 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
2aea0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
2aeb0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
2aec0 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
2aed0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
2aee0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2aef0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2af00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2af10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2af20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41        if( (k>=pA
2af30 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29  ggInfo->nColumn)
2af40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2af50 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f   (k = addAggInfo
2af60 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64  Column(pParse->d
2af70 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30  b, pAggInfo))>=0
2af80 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
2af90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2afa0 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
2afb0 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  >aCol[k];.      
2afc0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
2afd0 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
2afe0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2aff0 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pCol->iTable = p
2b000 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
2b010 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2b020 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ->iColumn = pExp
2b030 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
2b040 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2b050 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
2b060 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
2b070 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2b080 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  erColumn = -1;. 
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2b0a0 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  l->pExpr = pExpr
2b0b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b0c0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  if( pAggInfo->pG
2b0d0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
2b0e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c            int j,
2b0f0 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
2b100 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
2b110 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  B = pAggInfo->pG
2b120 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
2b130 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
2b140 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
2b150 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20  erm = pGB->a;.  
2b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
2b170 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pGB->nExpr;.  
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2b190 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c  r(j=0; j<n; j++,
2b1a0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
2b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2b1c0 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pE = pTerm->p
2b1d0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2b1e0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
2b1f0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
2b200 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78   pE->iTable==pEx
2b210 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b230 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d      pE->iColumn=
2b240 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
2b250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2b260 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
2b270 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  rterColumn = j;.
2b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b290 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2b2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2b2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2b2e0 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
2b2f0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
2b300 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2b310 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
2b320 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72  = pAggInfo->nSor
2b330 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20  tingColumn++;.  
2b340 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b350 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b360 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
2b370 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79   is now an entry
2b380 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41   for pExpr in pA
2b390 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28  ggInfo->aCol[] (
2b3a0 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20  either.         
2b3b0 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74     ** because it
2b3c0 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72   was there befor
2b3d0 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20  e or because we 
2b3e0 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29  just created it)
2b3f0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
2b400 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78   Convert the pEx
2b410 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47  pr to be a TK_AG
2b420 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69  G_COLUMN referri
2b430 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20  ng to that.     
2b440 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e         ** pAggIn
2b450 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79  fo->aCol[] entry
2b460 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
2b470 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
2b480 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2b490 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
2b4a0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ce);.           
2b4b0 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
2b4c0 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
2b4d0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2b4e0 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
2b4f0 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
2b500 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
2b510 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  16)k;.          
2b520 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2b530 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
2b540 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
2b550 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
2b560 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
2b570 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
2b580 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
2b590 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2b5a0 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
2b5b0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
2b5c0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  TION: {.      if
2b5d0 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ( (pNC->ncFlags 
2b5e0 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d  & NC_InAggFunc)=
2b5f0 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57 61  =0.       && pWa
2b600 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74  lker->walkerDept
2b610 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20  h==pExpr->op2.  
2b620 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
2b630 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2b640 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70  f pExpr is a dup
2b650 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
2b660 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20  r aggregate .   
2b670 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
2b680 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79   that is already
2b690 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f   in the pAggInfo
2b6a0 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20   structure.     
2b6b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74     */.        st
2b6c0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2b6d0 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49  c *pItem = pAggI
2b6e0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20  nfo->aFunc;.    
2b6f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2b700 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2b710 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2b720 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2b730 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2b740 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45  pItem->pExpr, pE
2b750 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  xpr, -1)==0 ){. 
2b760 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2b770 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b790 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
2b7a0 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
2b7b0 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
2b7c0 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
2b7d0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
2b7e0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
2b7f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2b800 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
2b810 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
2b820 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
2b830 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
2b840 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
2b850 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
2b860 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20  if( i>=0 ){.    
2b870 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b880 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2b890 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
2b8a0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20  lect) );.       
2b8b0 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41       pItem = &pA
2b8c0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2b8d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2b8e0 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
2b8f0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2b900 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b  pItem->iMem = ++
2b910 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2b920 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2b930 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2b940 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
2b950 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
2b960 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75        pItem->pFu
2b970 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
2b980 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
2b990 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
2b9a0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75          pExpr->u
2b9b0 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20  .zToken, .      
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2b9d0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
2b9e0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
2b9f0 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
2ba00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2ba10 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
2ba20 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
2ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2ba40 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2ba50 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2ba60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2ba70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2ba80 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2ba90 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
2baa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bab0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2bac0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
2bad0 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
2bae0 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
2baf0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
2bb00 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
2bb10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2bb20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2bb30 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
2bb40 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
2bb50 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53  );.        ExprS
2bb60 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
2bb70 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
2bb80 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
2bb90 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b  ->iAgg = (i16)i;
2bba0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
2bbb0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
2bbc0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
2bbd0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2bbe0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bbf0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
2bc00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
2bc10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2bc20 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2bc30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
2bc40 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2bc50 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20  InSelect(Walker 
2bc60 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
2bc70 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
2bc80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2bc90 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b  Select);.  pWalk
2bca0 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b  er->walkerDepth+
2bcb0 2b 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  +;.  return WRC_
2bcc0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
2bcd0 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41  ic void analyzeA
2bce0 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2bcf0 74 45 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57 61  tEnd(Walker *pWa
2bd00 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2bd10 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2bd20 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
2bd30 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ct);.  pWalker->
2bd40 77 61 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d  walkerDepth--;.}
2bd50 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
2bd60 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
2bd70 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
2bd80 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2bd90 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
2bda0 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
2bdb0 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
2bdc0 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  to AggInfo objec
2bdd0 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67  t that pNC->pAgg
2bde0 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  Info.** points t
2bdf0 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  o.  Additional e
2be00 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20  ntries are made 
2be10 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f  on the AggInfo o
2be20 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65  bject as.** nece
2be30 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
2be40 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
2be50 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
2be60 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
2be70 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
2be80 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
2be90 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
2bea0 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
2beb0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2bec0 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
2bed0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
2bee0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
2bef0 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
2bf00 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
2bf10 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
2bf20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2bf30 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
2bf40 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
2bf50 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2bf60 61 63 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67  ack2 = analyzeAg
2bf70 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
2bf80 45 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44  End;.  w.walkerD
2bf90 65 70 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  epth = 0;.  w.u.
2bfa0 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73  pNC = pNC;.  ass
2bfb0 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
2bfc0 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  st!=0 );.  sqlit
2bfd0 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
2bfe0 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
2bff0 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
2c000 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2c010 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
2c020 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
2c030 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
2c040 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
2c050 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
2c060 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2c070 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
2c080 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
2c090 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20   short..*/.void 
2c0a0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2c0b0 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
2c0c0 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
2c0d0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2c0e0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2c0f0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
2c100 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
2c110 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
2c120 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
2c130 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
2c140 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
2c150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2c160 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2c170 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
2c180 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2c190 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
2c1a0 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  ate a single new
2c1b0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73   register for us
2c1c0 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69  e to hold some i
2c1d0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
2c1e0 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lt..*/.int sqlit
2c1f0 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72  e3GetTempReg(Par
2c200 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
2c210 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
2c220 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Reg==0 ){.    re
2c230 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
2c240 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Mem;.  }.  retur
2c250 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  n pParse->aTempR
2c260 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65  eg[--pParse->nTe
2c270 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mpReg];.}../*.**
2c280 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65   Deallocate a re
2c290 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61  gister, making a
2c2a0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
2c2b0 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
2c2c0 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a  r.** purpose..**
2c2d0 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
2c2e0 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62  r is currently b
2c2f0 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 65  eing used by the
2c300 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74   column cache, t
2c310 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c  hen.** the deall
2c320 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72  ocation is defer
2c330 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f  red until the co
2c340 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20  lumn cache line 
2c350 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65  that uses.** the
2c360 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65   register become
2c370 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  s stale..*/.void
2c380 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2c390 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
2c3a0 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
2c3b0 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70  .  if( iReg && p
2c3c0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
2c3d0 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
2c3e0 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
2c3f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
2c400 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
2c410 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  p;.    for(i=0, 
2c420 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
2c430 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  che; i<pParse->n
2c440 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70  ColCache; i++, p
2c450 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
2c460 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
2c470 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52          p->tempR
2c480 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  eg = 1;.        
2c490 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
2c4a0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
2c4b0 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
2c4c0 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
2c4d0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
2c4e0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20  .** Allocate or 
2c4f0 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f  deallocate a blo
2c500 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65  ck of nReg conse
2c510 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
2c520 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2c530 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72  GetTempRange(Par
2c540 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2c550 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nReg){.  int i, 
2c560 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31  n;.  if( nReg==1
2c570 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65   ) return sqlite
2c580 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2c590 73 65 29 3b 0a 20 20 69 20 3d 20 70 50 61 72 73  se);.  i = pPars
2c5a0 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->iRangeReg;.  
2c5b0 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  n = pParse->nRan
2c5c0 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65  geReg;.  if( nRe
2c5d0 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  g<=n ){.    asse
2c5e0 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d  rt( !usedAsColum
2c5f0 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
2c600 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20  , i+n-1) );.    
2c610 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2c620 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  g += nReg;.    p
2c630 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2c640 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73   -= nReg;.  }els
2c650 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73  e{.    i = pPars
2c660 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
2c670 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
2c680 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Reg;.  }.  retur
2c690 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  n i;.}.void sqli
2c6a0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
2c6b0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2c6c0 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
2c6d0 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52   nReg){.  if( nR
2c6e0 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  eg==1 ){.    sql
2c6f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2c700 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 67 29  eg(pParse, iReg)
2c710 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2c720 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
2c730 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
2c740 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a  e, iReg, nReg);.
2c750 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73    if( nReg>pPars
2c760 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a  e->nRangeReg ){.
2c770 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
2c780 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20  geReg = nReg;.  
2c790 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
2c7a0 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  Reg = iReg;.  }.
2c7b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c  }../*.** Mark al
2c7c0 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  l temporary regi
2c7d0 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75  sters as being u
2c7e0 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72  navailable for r
2c7f0 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  euse..*/.void sq
2c800 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
2c810 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  gCache(Parse *pP
2c820 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
2c830 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  >nTempReg = 0;. 
2c840 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2c850 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg = 0;.}../*.**
2c860 20 56 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e   Validate that n
2c870 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  o temporary regi
2c880 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69  ster falls withi
2c890 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a  n the range of.*
2c8a0 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c  * iFirst..iLast,
2c8b0 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69   inclusive.  Thi
2c8c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
2c8d0 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68  y call from with
2c8e0 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73  in assert().** s
2c8f0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69  tatements..*/.#i
2c900 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2c910 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54  G.int sqlite3NoT
2c920 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73  empsInRange(Pars
2c930 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2c940 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74  First, int iLast
2c950 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
2c960 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  ( pParse->nRange
2c970 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72  Reg>0.   && pPar
2c980 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50  se->iRangeReg+pP
2c990 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3c  arse->nRangeReg<
2c9a0 69 4c 61 73 74 0a 20 20 20 26 26 20 70 50 61 72  iLast.   && pPar
2c9b0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3e 3d 69  se->iRangeReg>=i
2c9c0 46 69 72 73 74 0a 20 20 29 7b 0a 20 20 20 20 20  First.  ){.     
2c9d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2c9e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
2c9f0 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b  e->nTempReg; i++
2ca00 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
2ca10 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d  e->aTempReg[i]>=
2ca20 69 46 69 72 73 74 20 26 26 20 70 50 61 72 73 65  iFirst && pParse
2ca30 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69  ->aTempReg[i]<=i
2ca40 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
2ca50 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
2ca60 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2ca70 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2ca80 5f 44 45 42 55 47 20 2a 2f 0a                    _DEBUG */.