/ Hex Artifact Content
Login

Artifact fe11b91bb65b869143bd42023427c4429778ae42c0a0db7762f68f75b347a958:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
0fd0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
0fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
0ff0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1000: 29 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  ) works the same
1010: 20 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72   exact that it r
1020: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65  eturns the.** de
1030: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1040: 69 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20  if pExpr has no 
1050: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
1060: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  n..**.** The col
1070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1080: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
1090: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
10a0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
10b0: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
10c0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
10d0: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
10f0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
1100: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
1110: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
1120: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
1130: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
1140: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
1150: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1160: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1180: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1190: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
11b0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
11c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
11d0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
11e0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
11f0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >op;.    if( p->
1200: 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72  flags & EP_Gener
1210: 69 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ic ) break;.    
1220: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
1230: 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  || op==TK_UPLUS 
1240: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  ){.      p = p->
1250: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e  pLeft;.      con
1260: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1270: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   if( op==TK_COLL
1280: 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52  ATE || (op==TK_R
1290: 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 6f 70  EGISTER && p->op
12a0: 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 29 20 29  2==TK_COLLATE) )
12b0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
12c0: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
12d0: 71 28 70 50 61 72 73 65 2c 20 45 4e 43 28 64 62  q(pParse, ENC(db
12e0: 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  ), 0, p->u.zToke
12f0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1310: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1320: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1330: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  MN.          || 
1340: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1350: 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45  || op==TK_TRIGGE
1360: 52 29 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 54  R).     && p->pT
1370: 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ab!=0.    ){.   
1380: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
1390: 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62  ISTER && p->pTab
13a0: 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e  !=0 happens when
13b0: 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69   pExpr was origi
13c0: 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61  nally.      ** a
13d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77   TK_COLUMN but w
13e0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76  as previously ev
13f0: 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68  aluated and cach
1400: 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
1410: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 20   */.      int j 
1420: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
1430: 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a      if( j>=0 ){.
1440: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1450: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70  ar *zColl = p->p
1460: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
1470: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  ll;.        pCol
1480: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
1490: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
14a0: 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
14b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14d0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
14e0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
14f0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
1500: 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67   (p->pLeft->flag
1510: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
1520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20  =0 ){.        p 
1530: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1550: 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20 3d 20   Expr *pNext  = 
1560: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1570: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
1580: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
1590: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
15a0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
15b0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
15c0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
15d0: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
15e0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
15f0: 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68 6f 6c   /* p->flags hol
1600: 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20 61 6e  ds EP_Collate an
1610: 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  d p->pLeft->flag
1620: 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41 6e 64  s does not.  And
1630: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 78  .        ** p->x
1640: 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f 74 2e  .pSelect cannot.
1650: 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70 4c 65    So if p->x.pLe
1660: 66 74 20 65 78 69 73 74 73 2c 20 69 74 20 6d 75  ft exists, it mu
1670: 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20 20 20  st hold at.     
1680: 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20     ** least one 
1690: 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68 75 73  EP_Collate. Thus
16a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
16b0: 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a 20 20  wo ALWAYS. */.  
16c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 2e 70        if( p->x.p
16d0: 4c 69 73 74 21 3d 30 20 26 26 20 41 4c 57 41 59  List!=0 && ALWAY
16e0: 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  S(!ExprHasProper
16f0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
1700: 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ct)) ){.        
1710: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
1730: 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  YS(i<p->x.pList-
1740: 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20  >nExpr); i++){. 
1750: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45             if( E
1760: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1770: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1780: 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74  pExpr, EP_Collat
1790: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
17a0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78      pNext = p->x
17b0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
17c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1800: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
1810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1820: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
1830: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1840: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
1850: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
1860: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
1870: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1880: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
1890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
18a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18b0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
18c0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
18d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
18e0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
18f0: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
1900: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1910: 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c 6c  .** defautl coll
1920: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
1930: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1950: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
1960: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1970: 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  q() routine work
1980: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
1990: 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65 74  t that it.** ret
19a0: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19b0: 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64  re is no defined
19c0: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 43   collation..*/.C
19d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
19e0: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61 72  xprNNCollSeq(Par
19f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a00: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
1a10: 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Seq *p = sqlite3
1a20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1a30: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  se, pExpr);.  if
1a40: 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50 61  ( p==0 ) p = pPa
1a50: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1a60: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  ll;.  assert( p!
1a70: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a90: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74 77  n TRUE if the tw
1aa0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68 61  o expressions ha
1ab0: 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  ve equivalent co
1ac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ad0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1ae0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63  3ExprCollSeqMatc
1af0: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1b00: 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
1b10: 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53 65   *pE2){.  CollSe
1b20: 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c 69  q *pColl1 = sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a 20  (pParse, pE1);. 
1b50: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
1b60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
1b70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b80: 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  pE2);.  return s
1b90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ba0: 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f  oll1->zName, pCo
1bb0: 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b 0a  ll2->zName)==0;.
1bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1bd0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
1be0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1bf0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1c00: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1c10: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1c20: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1c30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c40: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1c50: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1c60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1c70: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1c80: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
1c90: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1ca0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
1cb0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
1cc0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
1cd0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1ce0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1cf0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1d00: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1d10: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1d20: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1d30: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1d40: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1d50: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1d60: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1d70: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1d80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d90: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1da0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
1db0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1dc0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
1dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1de0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1e00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1e10: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1e20: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1e30: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1e40: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1e50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e60: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1e70: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1e80: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1eb0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ec0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ed0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1ee0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1ef0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1f00: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1f10: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1f20: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1f30: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1f40: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1f50: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1f60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1f70: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1f80: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1f90: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1fa0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1fb0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1fc0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1fd0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1fe0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1ff0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2000: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2010: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2020: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2030: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2040: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2050: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2060: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2070: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
2080: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
2090: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
20a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
20b0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
20c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
20d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
20e0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
20f0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2100: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2110: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2120: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2130: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2140: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2150: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2160: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2170: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
2180: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
2190: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
21b0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
21c0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
21f0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2200: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2210: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2220: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2230: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2240: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2250: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2260: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2270: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
2280: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
2290: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
22a0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
22b0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
22c0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
22d0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
22e0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
22f0: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2300: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2310: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2320: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2330: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2340: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2350: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2360: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2370: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
2380: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
2390: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
23a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23b0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
23c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
23d0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
23e0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
23f0: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2400: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2410: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2420: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2430: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2440: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2460: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2470: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2480: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
2490: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
24a0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
24b0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
24c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
24d0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
24e0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
24f0: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2500: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2510: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2520: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2530: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2540: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2550: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2560: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2570: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2580: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
2590: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
25a0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
25b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25c0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
25d0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
25e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
25f0: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2600: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2610: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2620: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2630: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2640: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2650: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2660: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2670: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2680: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
2690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
26a0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
26b0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
26c0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
26d0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
26e0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
26f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2700: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2710: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2720: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2730: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2740: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2750: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2760: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2770: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2780: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
2790: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
27a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27b0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
27c0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
27d0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
27e0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
27f0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2800: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2810: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2820: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2830: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2840: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2850: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2860: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2870: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2880: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
2890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
28b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
28c0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
28d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
28e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
28f0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2900: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2910: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2920: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2940: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2950: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2960: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2970: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2980: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
2990: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
29a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
29b0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
29c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
29d0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
29e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
29f0: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2a00: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2a10: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2a20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2a30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2a40: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2a50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2a70: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2a80: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
2a90: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
2aa0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
2ab0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
2ac0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
2ad0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
2ae0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2af0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2b00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2b10: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2b20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2b30: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2b40: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2b50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2b60: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2b70: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2b80: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
2b90: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
2ba0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2bb0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
2bc0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
2bd0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2c00: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2c10: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2c20: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2c30: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2c40: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2c60: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2c70: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2c80: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
2c90: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
2ca0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
2cb0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
2cc0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
2cd0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
2ce0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2cf0: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2d00: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2d10: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2d20: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2d30: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2d40: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2d50: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2d60: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2d70: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2d80: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
2d90: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
2da0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
2db0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
2dc0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
2dd0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
2de0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2e00: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2e20: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2e30: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2e60: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2e70: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2e80: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2e90: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ea0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2eb0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ec0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ed0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2ee0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2ef0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2f00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2f10: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2f20: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2f30: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2f40: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2f50: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2f60: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2f70: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2f80: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2fb0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2fc0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2fd0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2fe0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2ff0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
3000: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
3010: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
3020: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
3030: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
3040: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
3050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3060: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
3070: 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70  bexpression of p
3080: 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74  Vector that is t
3090: 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d  he i-th.** colum
30a0: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
30b0: 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69  (numbered starti
30c0: 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65  ng with 0).  The
30d0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
30e0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73  ensure that i is
30f0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a   within range..*
3100: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3110: 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c  is really a scal
3120: 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22  ar (and "scalar"
3130: 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73   here includes s
3140: 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61  ubqueries.** tha
3150: 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  t return a singl
3160: 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20  e column!) then 
3170: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75  return pVector u
3180: 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  nmodified..**.**
3190: 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73   pVector retains
31a0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
31b0: 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65 78  e returned subex
31c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
31d0: 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69 73  If the vector is
31e0: 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20   a (SELECT ...) 
31f0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
3200: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a  ion returned is.
3210: 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70 72  ** just the expr
3220: 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  ession for the i
3230: 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
3240: 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
3250: 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65  may.** not be re
3260: 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ady for evaluati
3270: 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74  on because the t
3280: 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20  able cursor has 
3290: 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
32a0: 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45  positioned..*/.E
32b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74  xpr *sqlite3Vect
32c0: 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45  orFieldSubexpr(E
32d0: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e  xpr *pVector, in
32e0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
32f0: 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  i<sqlite3ExprVec
3300: 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29  torSize(pVector)
3310: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
3320: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56  3ExprIsVector(pV
3330: 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73  ector) ){.    as
3340: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f  sert( pVector->o
3350: 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72  p2==0 || pVector
3360: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
3370: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65  R );.    if( pVe
3380: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3390: 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e  ECT || pVector->
33a0: 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  op2==TK_SELECT )
33b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
33c0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
33d0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
33e0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
33f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3400: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3410: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3430: 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  pVector;.}../*.*
3440: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
3450: 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20  turn a new Expr 
3460: 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65  object which whe
3470: 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73  n passed to.** s
3480: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
3490: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61   will generate a
34a0: 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64  ll necessary cod
34b0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  e to compute.** 
34c0: 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f  the iField-th co
34d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
34e0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56  or expression pV
34f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ector..**.** It 
3500: 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f  is ok for pVecto
3510: 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  r to be a scalar
3520: 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69   (as long as iFi
3530: 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e  eld==0).  .** In
3540: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
3550: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
3560: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44  ike sqlite3ExprD
3570: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  up()..**.** The 
3580: 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20  caller owns the 
3590: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
35a0: 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70  ject and is resp
35b0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65  onsible for.** e
35c0: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
35d0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
35e0: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
35f0: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  freed..**.** The
3600: 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20   caller retains 
3610: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65  ownership of pVe
3620: 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f  ctor.  If pVecto
3630: 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54  r is a TK_SELECT
3640: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
3650: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77 69  turned object wi
3660: 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65  ll reference pVe
3670: 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63  ctor and so pVec
3680: 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a  tor must remain.
3690: 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ** valid for the
36a0: 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74   life of the ret
36b0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49  urned object.  I
36c0: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
36d0: 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61  K_VECTOR.** or a
36e0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
36f0: 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20  on, then it can 
3700: 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
3710: 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  on as this routi
3720: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a  ne.** returns..*
3730: 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20  *.** A trick to 
3740: 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43  cause a TK_SELEC
3750: 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20  T pVector to be 
3760: 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72  deleted together
3770: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74   with.** the ret
3780: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3790: 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74  t is to attach t
37a0: 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68  he pVector to th
37b0: 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a  e pRight field.*
37c0: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
37d0: 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  d TK_SELECT_COLU
37e0: 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a  MN Expr object..
37f0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3800: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
3810: 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ld(.  Parse *pPa
3820: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3830: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3840: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3850: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
3860: 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20  ector.  List of 
3870: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61  expressions or a
3880: 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20   sub-SELECT */. 
3890: 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20   int iField     
38a0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
38b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
38c0: 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  tor to return */
38d0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74  .){.  Expr *pRet
38e0: 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d  ;.  if( pVector-
38f0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
3910: 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45  ector->flags & E
3920: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20  P_xIsSelect );. 
3930: 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c     /* The TK_SEL
3940: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3950: 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  node:.    **.   
3960: 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20   ** pLeft:      
3970: 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e       pVector con
3980: 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43  taining TK_SELEC
3990: 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e  T.  Not deleted.
39a0: 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20  .    ** pRight: 
39b0: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65           not use
39c0: 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76  d.  But recursiv
39d0: 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  ely deleted..   
39e0: 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20   ** iColumn:    
39f0: 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20       Index of a 
3a00: 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f  column in pVecto
3a10: 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a  r.    ** iTable:
3a20: 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20 74            0 or t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
3a40: 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53 20  umns on the LHS 
3a50: 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74  of an assignment
3a60: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3a70: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3a80: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3a90: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3aa0: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3ab0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3ac0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
3ad0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
3ae0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
3af0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
3b00: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
3b10: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3b20: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3b30: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3b40: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3b50: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3b60: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3b70: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3b80: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3b90: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3ba0: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3bb0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
3bc0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
3bd0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
3be0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
3bf0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
3c00: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3c10: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3c20: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3c30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3c40: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3c50: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3c60: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3c70: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3c80: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3c90: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3ca0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3cb0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
3cc0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Ret ){.      pRe
3cd0: 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69  t->iColumn = iFi
3ce0: 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  eld;.      pRet-
3cf0: 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72  >pLeft = pVector
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3d10: 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70  rt( pRet==0 || p
3d20: 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  Ret->iTable==0 )
3d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
3d50: 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63  TK_VECTOR ) pVec
3d60: 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  tor = pVector->x
3d70: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
3d80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65  ].pExpr;.    pRe
3d90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3da0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
3db0: 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a  Vector, 0);.  }.
3dc0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
3de0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f  ssion pExpr is o
3df0: 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54  f type TK_SELECT
3e00: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
3e10: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69  to evaluate.** i
3e20: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  t. Return the re
3e30: 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20  gister in which 
3e40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
3e50: 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65  ored (or, if the
3e60: 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
3e70: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3e80: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  n one column, th
3e90: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3ea0: 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74  ray.** of regist
3eb0: 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65  ers in which the
3ec0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3ed0: 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  d)..**.** If pEx
3ee0: 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53  pr is not a TK_S
3ef0: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3f00: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
3f10: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
3f20: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
3f30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3f40: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
3f50: 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  eg = 0;.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3f70: 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
3f80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3f90: 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c  ){.    reg = sql
3fa0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
3fb0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
3fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
3fd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
3fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
3ff0: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
4000: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
4010: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4020: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4030: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4040: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4050: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4060: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4070: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4080: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
4090: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
40a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
40b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
40c0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
40d0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
40e0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
40f0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
4100: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
4110: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4120: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4130: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4140: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4150: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4160: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4170: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4180: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
4190: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
41a0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
41b0: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
41c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
41d0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
41e0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
41f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
4200: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
4210: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4220: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4230: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4240: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4250: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4260: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4270: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4280: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
4290: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
42a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
42b0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
42c0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
42d0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
42e0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
42f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4300: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
4310: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4320: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4330: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4340: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4350: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
4390: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
43a0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
43b0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
43c0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
43d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
43e0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
4410: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4420: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4450: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4460: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4470: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4480: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
4490: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
44a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
44b0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
44c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
44d0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
44e0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
44f0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
4500: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4510: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4520: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4530: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4540: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4550: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4560: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4570: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4580: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
45a0: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
45b0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
45c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
45d0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
45e0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
45f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
4600: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
4610: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4620: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4630: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4640: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4650: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4660: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4670: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4680: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
4690: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
46a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
46b0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
46c0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
46d0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
46e0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
46f0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4700: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
4710: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4720: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4730: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4740: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4750: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4770: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4780: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
4790: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
47a0: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
47b0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
47c0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
47d0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
47e0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
47f0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
4800: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4820: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4830: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4840: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4850: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4860: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4870: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4880: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4890: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
48a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
48b0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
48c0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
48d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
48e0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
48f0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4900: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
4910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4920: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4930: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4950: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4960: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4970: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4980: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4990: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
49a0: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
49b0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
49c0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
49d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
49e0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
49f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4a00: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4a10: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4a20: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4a30: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4a50: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  abel(v);..  if( 
4a60: 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45 78  nLeft!=sqlite3Ex
4a70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69  prVectorSize(pRi
4a80: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
4a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4aa0: 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
4ab0: 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72 65  isused");.    re
4ac0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ad0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4ae0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
4af0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
4b20: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20  p==TK_ISNOT .   
4b30: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72  ==TK_LT || pExpr
4b50: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20  ->op==TK_GT .   
4b60: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b70: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72  ==TK_LE || pExpr
4b80: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29  ->op==TK_GE .  )
4b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
4ba0: 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45  r->op==op || (pE
4bb0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26  xpr->op==TK_IS &
4bc0: 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20  & op==TK_EQ).   
4bd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78           || (pEx
4be0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4bf0: 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29   && op==TK_NE) )
4c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c10: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d  0 || pExpr->op!=
4c20: 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  op );.  assert( 
4c30: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4c40: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
4c50: 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53  op );..  p5 |= S
4c60: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20  QLITE_STOREP2;. 
4c70: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20   if( opx==TK_LE 
4c80: 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20  ) opx = TK_LT;. 
4c90: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20   if( opx==TK_GE 
4ca0: 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a  ) opx = TK_GT;..
4cb0: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4cc0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4cd0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4ce0: 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43  regRight = exprC
4cf0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
4d00: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20  rse, pRight);.. 
4d10: 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f   for(i=0; 1 /*Lo
4d20: 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65  op exits by "bre
4d30: 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20  ak"*/; i++){.   
4d40: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
4d50: 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  0, regFree2 = 0;
4d60: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a  .    Expr *pL, *
4d70: 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c  pR; .    int r1,
4d80: 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28   r2;.    assert(
4d90: 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74   i>=0 && i<nLeft
4da0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20   );.    if( i>0 
4db0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  ) sqlite3ExprCac
4dc0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
4dd0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4de0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4df0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4e00: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e10: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e20: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e30: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e40: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e50: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e60: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e70: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e80: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e90: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4ea0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4eb0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4ec0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ed0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ee0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ef0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f00: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f10: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f20: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f30: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f40: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f50: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f60: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f70: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f80: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f90: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4fa0: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fb0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fc0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fd0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fe0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4ff0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5000: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5010: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5020: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5030: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5040: 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70  i>0 ) sqlite3Exp
5050: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
5060: 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c  );.    if( i==nL
5070: 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62  eft-1 ){.      b
5080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5090: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29  if( opx==TK_EQ )
50a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
50b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
50c0: 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64  IfNot, dest, add
50d0: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
50e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
50f0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
5100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
5110: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29  if( opx==TK_NE )
5120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5140: 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f  If, dest, addrDo
5150: 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ne); VdbeCoverag
5160: 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c  e(v);.      p5 |
5170: 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  = SQLITE_KEEPNUL
5180: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
5190: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
51a0: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  TK_LT || op==TK_
51b0: 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20  GT || op==TK_LE 
51c0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  || op==TK_GE );.
51d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c  eAddOp2(v, OP_El
51f0: 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72  seNotEq, 0, addr
5200: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Done);.      Vdb
5210: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
5220: 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20  p==TK_LT);.     
5230: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
5240: 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20  v, op==TK_GT);. 
5250: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5260: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45  eIf(v, op==TK_LE
5270: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5280: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
5290: 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28  K_GE);.      if(
52a0: 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70   i==nLeft-2 ) op
52b0: 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  x = op;.    }.  
52c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
52d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
52e0: 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66  ddrDone);.}..#if
52f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
5300: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
5310: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
5320: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
5330: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
5340: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
5350: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
5360: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
5370: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
5380: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5390: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
53a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
53b0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
53c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
53d0: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
53e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
53f0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
5400: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
5410: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5420: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
5430: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
5440: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
5450: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5460: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
5470: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
5480: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
5490: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
54a0: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
54b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
54c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
54d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
54e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
54f0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
5500: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
5510: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
5520: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
5530: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
5540: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
5550: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
5560: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
5570: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5580: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
5590: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
55a0: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
55b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
55c0: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
55d0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
55e0: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
55f0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
5600: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
5610: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
5620: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
5630: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
5640: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
5650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5660: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
5670: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5680: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5690: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
56a0: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
56b0: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
56c0: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
56d0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
56e0: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
56f0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
5700: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5710: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5720: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5730: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
5740: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
5750: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
5760: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
5770: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
5780: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5790: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
57a0: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
57b0: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
57c0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
57d0: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
57e0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
57f0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
5800: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
5810: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5820: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
5830: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5840: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5850: 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29  EList, pnHeight)
5860: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5870: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
5880: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
5890: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
58a0: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
58b0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
58c0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
58d0: 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67  ->pPrior, pnHeig
58e0: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
58f0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
5900: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
5910: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
5920: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
5930: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
5940: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
5950: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
5960: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
5970: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
5980: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
5990: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
59a0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
59b0: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
59c0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
59d0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
59e0: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
59f0: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
5a00: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
5a10: 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61  agate EP_Propaga
5a20: 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d  te flags up from
5a30: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f   Expr.x.pList to
5a40: 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20   Expr.flags,.** 
5a50: 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
5a60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5a70: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
5a80: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
5a90: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5aa0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
5ab0: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5ac0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5ad0: 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74  pRight, &nHeight
5ae0: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
5af0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5b00: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
5b10: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5b20: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e  p->x.pSelect, &n
5b30: 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  Height);.  }else
5b40: 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20   if( p->x.pList 
5b50: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
5b60: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
5b70: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
5b80: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5b90: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5ba0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5bb0: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5bc0: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
5bd0: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
5be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5bf0: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
5c00: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
5c10: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
5c20: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
5c30: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
5c40: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
5c50: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
5c60: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
5c70: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5c80: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
5c90: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
5ca0: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5cb0: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5cc0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5cd0: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5ce0: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5cf0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5d00: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5d10: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5d20: 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p){.  if( pParse
5d30: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
5d40: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
5d50: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
5d60: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
5d70: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
5d80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
5d90: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
5da0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
5db0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5dc0: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
5dd0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5de0: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
5df0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
5e00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
5e10: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
5e20: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
5e30: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
5e40: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
5e50: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
5e60: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
5e70: 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67   /* ABOVE:  Heig
5e80: 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65  ht enforcement e
5e90: 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20  nabled.  BELOW: 
5ea0: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5eb0: 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20  nt off */./*.** 
5ec0: 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  Propagate all EP
5ed0: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5ee0: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5ef0: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5f00: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5f10: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5f20: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5f30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5f40: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5f50: 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  p && p->x.pList 
5f60: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
5f70: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
5f80: 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66  ect) ){.    p->f
5f90: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
5fa0: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
5fb0: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5fc0: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  .pList);.  }.}.#
5fd0: 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65  define exprSetHe
5fe0: 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f  ight(y).#endif /
5ff0: 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  * SQLITE_MAX_EXP
6000: 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a  R_DEPTH>0 */../*
6010: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6020: 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c   is the core all
6030: 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20  ocator for Expr 
6040: 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e  nodes..**.** Con
6050: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
6060: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
6070: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
6080: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
6090: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
60a0: 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54  e and for the pT
60b0: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  oken argument is
60c0: 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   a single alloca
60d0: 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  tion.** obtained
60e0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
60f0: 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61  alloc().  The ca
6100: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
6110: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
6120: 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
6130: 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75   the node eventu
6140: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
6150: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  .**.** If dequot
6160: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
6170: 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74  the token (if it
6180: 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75   exists) is dequ
6190: 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75  oted..** If dequ
61a0: 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f  ote is false, no
61b0: 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65   dequoting is pe
61c0: 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64 65  rformed.  The de
61d0: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
61e0: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
61f0: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
6200: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
6210: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
6220: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
6230: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
6240: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
6250: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
6260: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
6270: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
6280: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
6290: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
62a0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
62b0: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
62c0: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
62d0: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
62e0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
62f0: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
6300: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
6310: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
6320: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
6330: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
6340: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
6350: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
6360: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
6370: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
6380: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
6390: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
63a0: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
63b0: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
63c0: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
63d0: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
63e0: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
63f0: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
6400: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
6410: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
6420: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
6430: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
6440: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6450: 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  awNN() */.  int 
6460: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6470: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6480: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6490: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
64a0: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
64b0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
64c0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
64d0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
64e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
64f0: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
6500: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
6510: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
6520: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
6530: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
6540: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
6550: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
6560: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
6570: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
6580: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
6590: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
65a0: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
65b0: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
65c0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
65d0: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
65e0: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
65f0: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
6600: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
6610: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
6620: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
6630: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
6640: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
6650: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6660: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
6670: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
6680: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
6690: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
66a0: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
66b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
66c0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
66d0: 6c 75 65 7c 45 50 5f 4c 65 61 66 3b 0a 20 20 20  lue|EP_Leaf;.   
66e0: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61       pNew->u.iVa
66f0: 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20  lue = iValue;.  
6700: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6710: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
6720: 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  n = (char*)&pNew
6730: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [1];.        ass
6740: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d  ert( pToken->z!=
6750: 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d  0 || pToken->n==
6760: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
6770: 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d   pToken->n ) mem
6780: 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  cpy(pNew->u.zTok
6790: 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  en, pToken->z, p
67a0: 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20  Token->n);.     
67b0: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
67c0: 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30  n[pToken->n] = 0
67d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
67e0: 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33  quote && sqlite3
67f0: 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e  Isquote(pNew->u.
6800: 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20  zToken[0]) ){.  
6810: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
6820: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
6830: 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73  "' ) pNew->flags
6840: 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64   |= EP_DblQuoted
6850: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
6860: 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d  te3Dequote(pNew-
6870: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
6880: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6890: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
68a0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
68b0: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
68c0: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
68d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
68e0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
68f0: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
6900: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
6910: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
6920: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
6930: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
6940: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
6950: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
6960: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
6970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
6980: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
6990: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
69a0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
69b0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
69c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
69d0: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
69e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
69f0: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
6a00: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
6a10: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6a20: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
6a30: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
6a40: 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   x.n = sqlite3St
6a50: 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 3b 0a  rlen30(zToken);.
6a60: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
6a70: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70  ExprAlloc(db, op
6a80: 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  , &x, 0);.}../*.
6a90: 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74 72 65  ** Attach subtre
6aa0: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
6ab0: 67 68 74 20 74 6f 20 74 68 65 20 45 78 70 72 20  ght to the Expr 
6ac0: 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a  node pRoot..**.*
6ad0: 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c  * If pRoot==NULL
6ae0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
6af0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
6b00: 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  tion error has o
6b10: 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74  ccurred..** In t
6b20: 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65  hat case, delete
6b30: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 70 4c   the subtrees pL
6b40: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
6b50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
6b60: 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65  xprAttachSubtree
6b70: 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
6b80: 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c  ,.  Expr *pRoot,
6b90: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a  .  Expr *pLeft,.
6ba0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29    Expr *pRight.)
6bb0: 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30  {.  if( pRoot==0
6bc0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6bd0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6be0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   );.    sqlite3E
6bf0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  xprDelete(db, pL
6c00: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
6c10: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6c20: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
6c30: 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  {.    if( pRight
6c40: 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d   ){.      pRoot-
6c50: 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74  >pRight = pRight
6c60: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66  ;.      pRoot->f
6c70: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
6c80: 67 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66  gate & pRight->f
6c90: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lags;.    }.    
6ca0: 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20  if( pLeft ){.   
6cb0: 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20     pRoot->pLeft 
6cc0: 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70  = pLeft;.      p
6cd0: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
6ce0: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c  P_Propagate & pL
6cf0: 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  eft->flags;.    
6d00: 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65 69  }.    exprSetHei
6d10: 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a  ght(pRoot);.  }.
6d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
6d30: 65 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77  e an Expr node w
6d40: 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61  hich joins as ma
6d50: 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72 65  ny as two subtre
6d60: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72  es..**.** One or
6d70: 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62   both of the sub
6d80: 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c  trees can be NUL
6d90: 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  L.  Return a poi
6da0: 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a  nter to the new.
6db0: 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f  ** Expr node.  O
6dc0: 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72  r, if an OOM err
6dd0: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70  or occurs, set p
6de0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
6df0: 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65  cFailed,.** free
6e00: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61 6e   the subtrees an
6e10: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
6e20: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50  /.Expr *sqlite3P
6e30: 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70  Expr(.  Parse *p
6e40: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
6e50: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
6e60: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
6e90: 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  code */.  Expr *
6ea0: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
6eb0: 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e    /* Left operan
6ec0: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  d */.  Expr *pRi
6ed0: 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  ght            /
6ee0: 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20  * Right operand 
6ef0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b  */.){.  Expr *p;
6f00: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e  .  if( op==TK_AN
6f10: 44 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  D && pParse->nEr
6f20: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  r==0 ){.    /* T
6f30: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
6f40: 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66   short-circuit f
6f50: 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  alse optimizatio
6f60: 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20  n for AND */.   
6f70: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
6f80: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
6f90: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
6fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
6fb0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6fc0: 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62  RawNN(pParse->db
6fd0: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
6fe0: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
6ff0: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
7000: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
7010: 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f 70        p->op = op
7020: 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a 20   & TKFLG_MASK;. 
7030: 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d       p->iAgg = -
7040: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
7050: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
7060: 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64  btrees(pParse->d
7070: 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  b, p, pLeft, pRi
7080: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ght);.  }.  if( 
7090: 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  p ) {.    sqlite
70a0: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
70b0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
70c0: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ght);.  }.  retu
70d0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn p;.}../*.** A
70e0: 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68  dd pSelect to th
70f0: 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  e Expr.x.pSelect
7100: 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20   field.  Or, if 
7110: 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64  pExpr is NULL (d
7120: 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72  ue.** do a memor
7130: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
7140: 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74  lure) then delet
7150: 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62  e the pSelect ob
7160: 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ject..*/.void sq
7170: 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
7180: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
7190: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
71a0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
71b0: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b  {.  if( pExpr ){
71c0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53  .    pExpr->x.pS
71d0: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
71e0: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
71f0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
7200: 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71  IsSelect|EP_Subq
7210: 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
7220: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
7230: 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20  ndFlags(pParse, 
7240: 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  pExpr);.  }else{
7250: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
7260: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
7270: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
7280: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
7290: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
72a0: 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  lect);.  }.}.../
72b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
72c0: 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  ession is always
72d0: 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72 20   either TRUE or 
72e0: 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69 76  FALSE (respectiv
72f0: 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  ely),.** then re
7300: 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20  turn 1.  If one 
7310: 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
7320: 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75 65   the truth value
7330: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
7340: 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65  ssion at compile
7350: 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a  -time return 0..
7360: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
7370: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
7380: 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75  If is OK to retu
7390: 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20 69  rn 0 here even i
73a0: 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  f.** the express
73b0: 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c  ion really is al
73c0: 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61  ways false or fa
73d0: 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67  lse (a false neg
73e0: 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69  ative)..** But i
73f0: 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72 65  t is a bug to re
7400: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
7410: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68  pression might h
7420: 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
7430: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20   boolean values 
7440: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69 72  in different cir
7450: 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61  cumstances (a fa
7460: 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a  lse positive.).*
7470: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
7480: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7490: 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64   is part of cond
74a0: 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a  itional for a.**
74b0: 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
74c0: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
74d0: 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d  mine at compile-
74e0: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
74f0: 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75  not.** is it tru
7500: 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61  e or false, so a
7510: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a  lways return 0..
7520: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
7530: 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78 70  prAlwaysTrue(Exp
7540: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d  r *p){.  int v =
7550: 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
7560: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
7570: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
7580: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
7590: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
75a0: 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72  r(p, &v) ) retur
75b0: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21  n 0;.  return v!
75c0: 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  =0;.}.static int
75d0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
75e0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
75f0: 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78   v = 0;.  if( Ex
7600: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7610: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
7620: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
7630: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e  !sqlite3ExprIsIn
7640: 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72  teger(p, &v) ) r
7650: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
7660: 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n v==0;.}../*.**
7670: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
7680: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
7690: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
76a0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
76b0: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
76c0: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
76d0: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
76e0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  sion..**.** If o
76f0: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f  ne side or the o
7700: 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20  ther of the AND 
7710: 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66  is known to be f
7720: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65  alse, then inste
7730: 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69  ad.** of returni
7740: 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73  ng an AND expres
7750: 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72  sion, just retur
7760: 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  n a constant exp
7770: 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ression with.** 
7780: 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65  a value of false
7790: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
77a0: 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65  e3ExprAnd(sqlite
77b0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65  3 *db, Expr *pLe
77c0: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
77d0: 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d  ){.  if( pLeft==
77e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
77f0: 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20  pRight;.  }else 
7800: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b  if( pRight==0 ){
7810: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66  .    return pLef
7820: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  t;.  }else if( e
7830: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
7840: 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77  Left) || exprAlw
7850: 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29  aysFalse(pRight)
7860: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7870: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  xprDelete(db, pL
7880: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
7890: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
78a0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
78b0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
78c0: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45  lloc(db, TK_INTE
78d0: 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74  GER, &sqlite3Int
78e0: 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20  Tokens[0], 0);. 
78f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
7900: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
7910: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
7920: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
7930: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
7940: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
7950: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
7960: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
7970: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
7980: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
7990: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
79a0: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
79b0: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
79c0: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
79d0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
79e0: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
79f0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
7a00: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
7a10: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
7a20: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
7a30: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7a40: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
7a50: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
7a60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
7a70: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
7a80: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
7a90: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
7aa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7ab0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
7ac0: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
7ad0: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
7ae0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
7af0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7b00: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
7b10: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45 78  st = pList;.  Ex
7b20: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
7b30: 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29 3b  ew, EP_HasFunc);
7b40: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7b50: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7b60: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
7b80: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7b90: 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  s(pParse, pNew);
7ba0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
7bc0: 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  a variable numbe
7bd0: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
7be0: 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20  on that encodes 
7bf0: 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e  a wildcard.** in
7c00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
7c10: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a  L statement.  .*
7c20: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63  *.** Wildcards c
7c30: 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
7c40: 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73  ingle "?" are as
7c50: 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20  signed the next 
7c60: 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61  sequential.** va
7c70: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a  riable number..*
7c80: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
7c90: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
7ca0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
7cb0: 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e  he number "nnn".
7cc0: 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72    We make.** sur
7cd0: 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74  e "nnn" is not t
7ce0: 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69 64 20  oo big to avoid 
7cf0: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
7d00: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
7d10: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
7d20: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
7d30: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
7d40: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
7d50: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
7d60: 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20  ":aaa", "@aaa", 
7d70: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
7d80: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
7d90: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
7da0: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
7db0: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
7dc0: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
7dd0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
7de0: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
7df0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
7e00: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
7e10: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
7e20: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
7e30: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7e40: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
7e50: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
7e60: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
7e70: 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c 69  , u32 n){.  sqli
7e80: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7e90: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
7ea0: 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20 78  ar *z;.  ynVar x
7eb0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
7ec0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
7ed0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
7ee0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
7ef0: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
7f00: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
7f10: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
7f20: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
7f30: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
7f40: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
7f50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
7f60: 3d 28 75 33 32 29 73 71 6c 69 74 65 33 53 74 72  =(u32)sqlite3Str
7f70: 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69 66  len30(z) );.  if
7f80: 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20  ( z[1]==0 ){.   
7f90: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
7fa0: 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41  the form "?".  A
7fb0: 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76  ssign the next v
7fc0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
7fd0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b  /.    assert( z[
7fe0: 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 78  0]=='?' );.    x
7ff0: 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61   = (ynVar)(++pPa
8000: 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65  rse->nVar);.  }e
8010: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f 41  lse{.    int doA
8020: 64 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  dd = 0;.    if( 
8030: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  z[0]=='?' ){.   
8040: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
8050: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
8060: 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e  ".  Convert "nnn
8070: 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  " to an integer 
8080: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  and.      ** use
8090: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
80a0: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
80b0: 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20      i64 i;.     
80c0: 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20 20   int bOk;.      
80d0: 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f 50  if( n==2 ){ /*OP
80e0: 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54 52  TIMIZATION-IF-TR
80f0: 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 69 20 3d  UE*/.        i =
8100: 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20 54   z[1]-'0';  /* T
8110: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
8120: 66 20 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67 6c  f ?N for a singl
8130: 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20 20  e digit N */.   
8140: 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20       bOk = 1;.  
8150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8160: 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69     bOk = 0==sqli
8170: 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c  te3Atoi64(&z[1],
8180: 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45   &i, n-1, SQLITE
8190: 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a  _UTF8);.      }.
81a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
81b0: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  i==0 );.      te
81c0: 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a  stcase( i==1 );.
81d0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
81e0: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
81f0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
8200: 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b  BLE_NUMBER]-1 );
8210: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8220: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
8230: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8240: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a  ABLE_NUMBER] );.
8250: 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30        if( bOk==0
8260: 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d   || i<1 || i>db-
8270: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
8280: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
8290: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20  MBER] ){.       
82a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
82b0: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
82c0: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
82d0: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
82e0: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
82f0: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51     db->aLimit[SQ
8300: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
8310: 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20  BLE_NUMBER]);.  
8320: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8330: 20 20 20 20 7d 0a 20 20 20 20 20 20 78 20 3d 20      }.      x = 
8340: 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20  (ynVar)i;.      
8350: 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 56  if( x>pParse->nV
8360: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ar ){.        pP
8370: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e  arse->nVar = (in
8380: 74 29 78 3b 0a 20 20 20 20 20 20 20 20 64 6f 41  t)x;.        doA
8390: 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  dd = 1;.      }e
83a0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 56  lse if( sqlite3V
83b0: 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50  ListNumToName(pP
83c0: 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78 29  arse->pVList, x)
83d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==0 ){.        d
83e0: 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  oAdd = 1;.      
83f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
8400: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20     /* Wildcards 
8410: 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61  like ":aaa", "$a
8420: 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20  aa" or "@aaa".  
8430: 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  Reuse the same v
8440: 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  ariable.      **
8450: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70   number as the p
8460: 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20  rior appearance 
8470: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
8480: 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65  , or if the name
8490: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65  .      ** has ne
84a0: 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66  ver appeared bef
84b0: 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73  ore, reuse the s
84c0: 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ame variable num
84d0: 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ber.      */.   
84e0: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 73 71     x = (ynVar)sq
84f0: 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d 65 54 6f  lite3VListNameTo
8500: 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c 69  Num(pParse->pVLi
8510: 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  st, z, n);.     
8520: 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20   if( x==0 ){.   
8530: 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29       x = (ynVar)
8540: 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29  (++pParse->nVar)
8550: 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64 20  ;.        doAdd 
8560: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
8570: 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 41 64 64   }.    if( doAdd
8580: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
8590: 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pVList = sqlit
85a0: 65 33 56 4c 69 73 74 41 64 64 28 64 62 2c 20 70  e3VListAdd(db, p
85b0: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a  Parse->pVList, z
85c0: 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a 20  , n, x);.    }. 
85d0: 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c   }.  pExpr->iCol
85e0: 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20 78  umn = x;.  if( x
85f0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
8600: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
8610: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
8620: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8630: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
8640: 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  ny SQL variables
8650: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
8660: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
8670: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
8680: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  n tree..*/.stati
8690: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
86a0: 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  E void sqlite3Ex
86b0: 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74  prDeleteNN(sqlit
86c0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
86d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
86e0: 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20   );.  /* Sanity 
86f0: 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68  check: Assert th
8700: 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20  at the IntValue 
8710: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  is non-negative 
8720: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
8730: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
8740: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8750: 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d  _IntValue) || p-
8760: 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  >u.iValue>=0 );.
8770: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8780: 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48 61  BUG.  if( ExprHa
8790: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
87a0: 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48 61  Leaf) && !ExprHa
87b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
87c0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
87d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 65    assert( p->pLe
87e0: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ft==0 );.    ass
87f0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
8800: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8810: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30   p->x.pSelect==0
8820: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
8830: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
8840: 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b  perty(p, (EP_Tok
8850: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29  enOnly|EP_Leaf))
8860: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45   ){.    /* The E
8870: 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e  xpr.x union is n
8880: 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65  ever used at the
8890: 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78   same time as Ex
88a0: 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  pr.pRight */.   
88b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c   assert( p->x.pL
88c0: 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ist==0 || p->pRi
88d0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
88e0: 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70 2d  ( p->pLeft && p-
88f0: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op!=TK_SELECT_C
8900: 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45  OLUMN ) sqlite3E
8910: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
8920: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  p->pLeft);.    i
8930: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
8940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8950: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 2d  rDeleteNN(db, p-
8960: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 65  >pRight);.    }e
8970: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
8980: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
8990: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
89a0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
89b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
89c0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
89d0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
89e0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
89f0: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  db, p->x.pList);
8a00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8a10: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8a20: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
8a30: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
8a40: 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  (db, p->u.zToken
8a50: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
8a60: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8a70: 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73  Static) ){.    s
8a80: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
8a90: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  b, p);.  }.}.voi
8aa0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
8ab0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
8ac0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
8ad0: 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70 72   p ) sqlite3Expr
8ae0: 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b  DeleteNN(db, p);
8af0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8b00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
8b10: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
8b20: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
8b30: 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  n structure .** 
8b40: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
8b50: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
8b60: 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  is is always one
8b70: 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   of EXPR_FULLSIZ
8b80: 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43  E,.** EXPR_REDUC
8b90: 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54  EDSIZE or EXPR_T
8ba0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f  OKENONLYSIZE..*/
8bb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
8bc0: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
8bd0: 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48  *p){.  if( ExprH
8be0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8bf0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65  _TokenOnly) ) re
8c00: 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  turn EXPR_TOKENO
8c10: 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45  NLYSIZE;.  if( E
8c20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8c30: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20  , EP_Reduced) ) 
8c40: 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55  return EXPR_REDU
8c50: 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72  CEDSIZE;.  retur
8c60: 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  n EXPR_FULLSIZE;
8c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75  .}../*.** The du
8c80: 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72  pedExpr*Size() r
8c90: 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74  outines each ret
8ca0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8cb0: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
8cc0: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63  .** to store a c
8cd0: 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73  opy of an expres
8ce0: 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69  sion or expressi
8cf0: 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64  on tree.  They d
8d00: 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20  iffer in.** how 
8d10: 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65  much of the tree
8d20: 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a   is measured..**
8d30: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
8d40: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20  rStructSize()   
8d50: 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74    Size of only t
8d60: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
8d70: 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  e .**     dupedE
8d80: 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20  xprNodeSize()   
8d90: 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72      Size of Expr
8da0: 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b   + space for tok
8db0: 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  en.**     dupedE
8dc0: 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20  xprSize()       
8dd0: 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e      Expr + token
8de0: 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f   + subtree compo
8df0: 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  nents.**.*******
8e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e40: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
8e50: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
8e60: 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  ze() function re
8e70: 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73  turns two values
8e80: 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a   OR-ed together:
8e90: 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70    .** (1) the sp
8ea0: 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
8eb0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
8ec0: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e  xpr structure on
8ed0: 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74  ly and .** (2) t
8ee0: 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20  he EP_xxx flags 
8ef0: 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68  that indicate wh
8f00: 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65  at the structure
8f10: 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e   size should be.
8f20: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
8f30: 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20  alues is always 
8f40: 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
8f50: 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45     EXPR_FULLSIZE
8f60: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45  .**      EXPR_RE
8f70: 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50  DUCEDSIZE   | EP
8f80: 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20  _Reduced.**     
8f90: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
8fa0: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
8fb0: 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ly.**.** The siz
8fc0: 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  e of the structu
8fd0: 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  re can be found 
8fe0: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72  by masking the r
8ff0: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f  eturn value.** o
9000: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  f this routine w
9010: 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20  ith 0xfff.  The 
9020: 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75  flags can be fou
9030: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
9040: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
9050: 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65  e with EP_Reduce
9060: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a  d|EP_TokenOnly..
9070: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
9080: 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52  with flags==EXPR
9090: 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73  DUP_REDUCE, this
90a0: 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20   routines works 
90b0: 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20  on full-size.** 
90c0: 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72  (unreduced) Expr
90d0: 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79   objects as they
90e0: 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63   or originally c
90f0: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68  onstructed by th
9100: 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72  e parser..** Dur
9110: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ing expression a
9120: 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69  nalysis, extra i
9130: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f  nformation is co
9140: 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64  mputed and moved
9150: 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70   into.** later p
9160: 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72  arts of teh Expr
9170: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74   object and that
9180: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
9190: 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f  on might get cho
91a0: 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74  pped.** off if t
91b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
91c0: 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20   reduced.  Note 
91d0: 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65  also that it doe
91e0: 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a  s not work to.**
91f0: 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50   make an EXPRDUP
9200: 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20  _REDUCE copy of 
9210: 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73  a reduced expres
9220: 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c  sion.  It is onl
9230: 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65  y legal.** to re
9240: 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20  duce a pristine 
9250: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
9260: 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e  from the parser.
9270: 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61    The implementa
9280: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64  tion.** of duped
9290: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
92a0: 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c   contain multipl
92b0: 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  e assert() state
92c0: 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d  ments that attem
92d0: 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65  pt.** to enforce
92e0: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
92f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9300: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
9310: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
9320: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
9330: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
9340: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
9350: 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d  EDUCE || flags==
9360: 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65  0 ); /* Only one
9370: 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f   flag value allo
9380: 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  wed */.  assert(
9390: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d   EXPR_FULLSIZE<=
93a0: 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72  0xfff );.  asser
93b0: 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50 5f  t( (0xfff & (EP_
93c0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
93d0: 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69  Only))==0 );.  i
93e0: 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20 70  f( 0==flags || p
93f0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
9400: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6e 53  COLUMN ){.    nS
9410: 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53  ize = EXPR_FULLS
9420: 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IZE;.  }else{.  
9430: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
9440: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9450: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
9460: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73  duced) );.    as
9470: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
9480: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
9490: 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61  mJoin) ); .    a
94a0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
94b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65  roperty(p, EP_Me
94c0: 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61  mToken) );.    a
94d0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
94e0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f  roperty(p, EP_No
94f0: 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69  Reduce) );.    i
9500: 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70  f( p->pLeft || p
9510: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
9520: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
9530: 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50  REDUCEDSIZE | EP
9540: 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65  _Reduced;.    }e
9550: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
9560: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
9570: 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  );.      nSize =
9580: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
9590: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
95a0: 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ly;.    }.  }.  
95b0: 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a  return nSize;.}.
95c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
95d0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
95e0: 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
95f0: 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
9600: 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f  e the copy .** o
9610: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
9620: 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20  ture and a copy 
9630: 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54  of the Expr.u.zT
9640: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
9650: 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69  that.** string i
9660: 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73  s defined.).*/.s
9670: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
9680: 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72  xprNodeSize(Expr
9690: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
96a0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64  .  int nByte = d
96b0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
96c0: 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30  ze(p, flags) & 0
96d0: 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70  xfff;.  if( !Exp
96e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
96f0: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
9700: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
9710: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
9720: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
9730: 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a  .zToken)+1;.  }.
9740: 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
9750: 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nByte);.}../*.**
9760: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
9770: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
9780: 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  ired to create a
9790: 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68   duplicate of th
97a0: 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  e .** expression
97b0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
97c0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
97d0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
97e0: 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20  nt is a.** mask 
97f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44  containing EXPRD
9800: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
9810: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
9820: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
9830: 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20  space to create 
9840: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
9850: 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73  pr struct.** its
9860: 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66 66  elf and the buff
9870: 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 62  er referred to b
9880: 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c  y Expr.u.zToken,
9890: 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49   if any..**.** I
98a0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
98b0: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
98c0: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
98d0: 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73  n value includes
98e0: 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75   .** space to du
98f0: 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72  plicate all Expr
9900: 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72   nodes in the tr
9910: 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70  ee formed by Exp
9920: 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20  r.pLeft .** and 
9930: 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69  Expr.pRight vari
9940: 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66  ables (but not f
9950: 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65  or any structure
9960: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20  s pointed to or 
9970: 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72  .** descended fr
9980: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
9990: 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53  ist or Expr.x.pS
99a0: 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29  elect variables)
99b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
99c0: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78  dupedExprSize(Ex
99d0: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
99e0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
99f0: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
9a00: 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64     nByte = duped
9a10: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
9a20: 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
9a30: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
9a40: 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42  DUCE ){.      nB
9a50: 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72  yte += dupedExpr
9a60: 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66  Size(p->pLeft, f
9a70: 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78 70  lags) + dupedExp
9a80: 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c  rSize(p->pRight,
9a90: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20   flags);.    }. 
9aa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74   }.  return nByt
9ab0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
9ac0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
9ad0: 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45  ilar to sqlite3E
9ae0: 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70 74  xprDup(), except
9af0: 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66 65   that if pzBuffe
9b00: 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c  r .** is not NUL
9b10: 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72  L then *pzBuffer
9b20: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70   is assumed to p
9b30: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
9b40: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a   large enough .*
9b50: 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  * to store the c
9b60: 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f  opy of expressio
9b70: 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20  n p, the copies 
9b80: 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a  of p->u.zToken.*
9b90: 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65  * (if applicable
9ba0: 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65  ), and the copie
9bb0: 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66  s of the p->pLef
9bc0: 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20  t and p->pRight 
9bd0: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
9be0: 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72  if any. Before r
9bf0: 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66  eturning, *pzBuf
9c00: 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74 68  fer is set to th
9c10: 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
9c20: 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  t the.** portion
9c30: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
9c40: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
9c50: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
9c60: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
9c70: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
9c80: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 64  , Expr *p, int d
9c90: 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a  upFlags, u8 **pz
9ca0: 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20  Buffer){.  Expr 
9cb0: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
9cc0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
9cd0: 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c  urn */.  u8 *zAl
9ce0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f  loc;           /
9cf0: 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 66  * Memory space f
9d00: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 75 69  rom which to bui
9d10: 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 2a  ld Expr object *
9d20: 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63 46 6c  /.  u32 staticFl
9d30: 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45 50 5f  ag;       /* EP_
9d40: 53 74 61 74 69 63 20 69 66 20 73 70 61 63 65 20  Static if space 
9d50: 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  not obtained fro
9d60: 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61  m malloc */..  a
9d70: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
9d80: 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20    assert( p );. 
9d90: 20 61 73 73 65 72 74 28 20 64 75 70 46 6c 61 67   assert( dupFlag
9da0: 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73  s==0 || dupFlags
9db0: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
9dc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a   );.  assert( pz
9dd0: 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70  Buffer==0 || dup
9de0: 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  Flags==EXPRDUP_R
9df0: 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46  EDUCE );..  /* F
9e00: 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20  igure out where 
9e10: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65 77  to write the new
9e20: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 2e   Expr structure.
9e30: 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75 66 66   */.  if( pzBuff
9e40: 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63  er ){.    zAlloc
9e50: 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20   = *pzBuffer;.  
9e60: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
9e70: 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73  P_Static;.  }els
9e80: 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20  e{.    zAlloc = 
9e90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
9ea0: 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45 78  awNN(db, dupedEx
9eb0: 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  prSize(p, dupFla
9ec0: 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74 69 63  gs));.    static
9ed0: 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Flag = 0;.  }.  
9ee0: 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a  pNew = (Expr *)z
9ef0: 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e  Alloc;..  if( pN
9f00: 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74  ew ){.    /* Set
9f10: 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65   nNewSize to the
9f20: 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20   size allocated 
9f30: 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72  for the structur
9f40: 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20  e pointed to.   
9f50: 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69   ** by pNew. Thi
9f60: 73 20 69 73 20 65 69 74 68 65 72 20 45 58 50 52  s is either EXPR
9f70: 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f  _FULLSIZE, EXPR_
9f80: 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20  REDUCEDSIZE or. 
9f90: 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e     ** EXPR_TOKEN
9fa0: 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e  ONLYSIZE. nToken
9fb0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
9fc0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63  umber of bytes c
9fd0: 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62  onsumed.    ** b
9fe0: 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  y the copy of th
9ff0: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
a000: 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20  ring (if any).. 
a010: 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20     */.    const 
a020: 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74  unsigned nStruct
a030: 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72  Size = dupedExpr
a040: 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 64 75  StructSize(p, du
a050: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e  pFlags);.    con
a060: 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20  st int nNewSize 
a070: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
a080: 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e  0xfff;.    int n
a090: 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 21  Token;.    if( !
a0a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a0b0: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
a0c0: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
a0d0: 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d  {.      nToken =
a0e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
a0f0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20  (p->u.zToken) + 
a100: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
a110: 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a      nToken = 0;.
a120: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 75      }.    if( du
a130: 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  pFlags ){.      
a140: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
a150: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
a160: 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20  duced)==0 );.   
a170: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
a180: 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a  , p, nNewSize);.
a190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a1a0: 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75 33   u32 nSize = (u3
a1b0: 32 29 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  2)exprStructSize
a1c0: 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  (p);.      memcp
a1d0: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
a1e0: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ze);.      if( n
a1f0: 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49  Size<EXPR_FULLSI
a200: 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d  ZE ){ .        m
a210: 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53  emset(&zAlloc[nS
a220: 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55  ize], 0, EXPR_FU
a230: 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20  LLSIZE-nSize);. 
a240: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a250: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f    /* Set the EP_
a260: 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65  Reduced, EP_Toke
a270: 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74  nOnly, and EP_St
a280: 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f  atic flags appro
a290: 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20  priately. */.   
a2a0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20   pNew->flags &= 
a2b0: 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  ~(EP_Reduced|EP_
a2c0: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61  TokenOnly|EP_Sta
a2d0: 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  tic|EP_MemToken)
a2e0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  ;.    pNew->flag
a2f0: 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  s |= nStructSize
a300: 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45   & (EP_Reduced|E
a310: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20  P_TokenOnly);.  
a320: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
a330: 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20   staticFlag;..  
a340: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d    /* Copy the p-
a350: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
a360: 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
a370: 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20   if( nToken ){. 
a380: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65       char *zToke
a390: 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  n = pNew->u.zTok
a3a0: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c  en = (char*)&zAl
a3b0: 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20  loc[nNewSize];. 
a3c0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b       memcpy(zTok
a3d0: 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  en, p->u.zToken,
a3e0: 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a   nToken);.    }.
a3f0: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d  .    if( 0==((p-
a400: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
a410: 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e 4f  gs) & (EP_TokenO
a420: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b  nly|EP_Leaf)) ){
a430: 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  .      /* Fill i
a440: 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53  n the pNew->x.pS
a450: 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78  elect or pNew->x
a460: 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a  .pList member. *
a470: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
a480: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
a490: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
a4a0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
a4b0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
a4c0: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
a4d0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75 70  ->x.pSelect, dup
a4e0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 65  Flags);.      }e
a4f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
a500: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c  w->x.pList = sql
a510: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
a520: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20  db, p->x.pList, 
a530: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  dupFlags);.     
a540: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a550: 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70   Fill in pNew->p
a560: 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70  Left and pNew->p
a570: 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66  Right. */.    if
a580: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a590: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
a5a0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
a5b0: 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63   ){.      zAlloc
a5c0: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64   += dupedExprNod
a5d0: 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67  eSize(p, dupFlag
a5e0: 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45  s);.      if( !E
a5f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a600: 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  New, EP_TokenOnl
a610: 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20  y|EP_Leaf) ){.  
a620: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
a630: 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a 20  t = p->pLeft ?. 
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c       exprDup(db,
a660: 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44   p->pLeft, EXPRD
a670: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
a680: 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  oc) : 0;.       
a690: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
a6a0: 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20 20  p->pRight ?.    
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20 70     exprDup(db, p
a6d0: 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55  ->pRight, EXPRDU
a6e0: 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f  P_REDUCE, &zAllo
a6f0: 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 0a  c) : 0;.      }.
a700: 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66        if( pzBuff
a710: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  er ){.        *p
a720: 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63  zBuffer = zAlloc
a730: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
a740: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
a750: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a760: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
a770: 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  EP_Leaf) ){.    
a780: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70      if( pNew->op
a790: 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  ==TK_SELECT_COLU
a7a0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
a7b0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
a7c0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  >pLeft;.        
a7d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f    assert( p->iCo
a7e0: 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  lumn==0 || p->pR
a7f0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
a800: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a810: 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d  pRight==0  || p-
a820: 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66  >pRight==p->pLef
a830: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t );.        }el
a840: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
a850: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
a860: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
a870: 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
a880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
a890: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  New->pRight = sq
a8a0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a8b0: 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a   p->pRight, 0);.
a8c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a8d0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
a8e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
a8f0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
a900: 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f  ep copy of the o
a910: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
a920: 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61  the second .** a
a930: 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f  rgument. If an O
a940: 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  OM condition is 
a950: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c  encountered, NUL
a960: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  L is returned.**
a970: 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c   and the db->mal
a980: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73  locFailed flag s
a990: 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  et..*/.#ifndef S
a9a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73  QLITE_OMIT_CTE.s
a9b0: 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74 68  tatic With *with
a9c0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
a9d0: 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74   With *p){.  Wit
a9e0: 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  h *pRet = 0;.  i
a9f0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
aa00: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
aa10: 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61  p) + sizeof(p->a
aa20: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d  [0]) * (p->nCte-
aa30: 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73  1);.    pRet = s
aa40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
aa50: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
aa60: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
aa70: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
aa80: 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70    pRet->nCte = p
aa90: 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f  ->nCte;.      fo
aaa0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
aab0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
aac0: 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pRet->a[i].pSele
aad0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
aae0: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  ctDup(db, p->a[i
aaf0: 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ].pSelect, 0);. 
ab00: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
ab10: 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65  ].pCols = sqlite
ab20: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
ab30: 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20   p->a[i].pCols, 
ab40: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  0);.        pRet
ab50: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
ab60: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ab70: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  b, p->a[i].zName
ab80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ab90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
aba0: 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  et;.}.#else.# de
abb0: 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79  fine withDup(x,y
abc0: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
abd0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
abe0: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
abf0: 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69  s make deep copi
ac00: 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  es of expression
ac10: 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s,.** expression
ac20: 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73   lists, ID lists
ac30: 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61  , and select sta
ac40: 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f  tements.  The co
ac50: 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64  pies can.** be d
ac60: 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67  eleted (by being
ac70: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72   passed to their
ac80: 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44   respective ...D
ac90: 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73  elete() routines
aca0: 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66  ).** without eff
acb0: 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  ecting the origi
acc0: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nals..**.** The 
acd0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
ace0: 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20   ID, and source 
acf0: 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20  lists return by 
ad00: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
ad10: 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  up(),.** sqlite3
ad20: 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64  IdListDup(), and
ad30: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
ad40: 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20  up() can not be 
ad50: 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64  further expanded
ad60: 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65   .** by subseque
ad70: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
ad80: 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20  te*ListAppend() 
ad90: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20  routines..**.** 
ada0: 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20  Any tables that 
adb0: 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68  the SrcList migh
adc0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e  t point to are n
add0: 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  ot duplicated..*
ade0: 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
adf0: 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e  arameter contain
ae00: 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  s a combination 
ae10: 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58  of the EXPRDUP_X
ae20: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20  XX flags..** If 
ae30: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
ae40: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
ae50: 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75  then the structu
ae60: 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  re returned is a
ae70: 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65  .** truncated ve
ae80: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75  rsion of the usu
ae90: 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72  al Expr structur
aea0: 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73  e that will be s
aeb0: 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74  tored as.** part
aec0: 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
aed0: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
aee0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
aef0: 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72   schema..*/.Expr
af00: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70   *sqlite3ExprDup
af10: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
af20: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
af30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  ){.  assert( fla
af40: 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
af50: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
af60: 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20 65  ;.  return p ? e
af70: 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c  xprDup(db, p, fl
af80: 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a 45  ags, 0) : 0;.}.E
af90: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
afa0: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
afb0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
afc0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
afd0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
afe0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
aff0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
b000: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
b010: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70  int i;.  Expr *p
b020: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d  PriorSelectCol =
b030: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   0;.  assert( db
b040: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
b050: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b060: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
b070: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
b080: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
b090: 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20 20 69  ize(db, p));.  i
b0a0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b0b0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
b0c0: 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72 3b  Expr = p->nExpr;
b0d0: 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65 77 2d  .  pItem = pNew-
b0e0: 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d  >a;.  pOldItem =
b0f0: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
b100: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
b110: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
b120: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
b130: 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f  r *pOldExpr = pO
b140: 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  ldItem->pExpr;. 
b150: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
b160: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  r;.    pItem->pE
b170: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
b180: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70  rDup(db, pOldExp
b190: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  r, flags);.    i
b1a0: 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20 20  f( pOldExpr .   
b1b0: 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e 6f    && pOldExpr->o
b1c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
b1d0: 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e 65  UMN.     && (pNe
b1e0: 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  wExpr = pItem->p
b1f0: 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29 7b  Expr)!=0 .    ){
b200: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b210: 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  NewExpr->iColumn
b220: 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20 20  ==0 || i>0 );.  
b230: 20 20 20 20 69 66 28 20 70 4e 65 77 45 78 70 72      if( pNewExpr
b240: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ->iColumn==0 ){.
b250: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b260: 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74 3d  pOldExpr->pLeft=
b270: 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67 68  =pOldExpr->pRigh
b280: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72  t );.        pPr
b290: 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 70  iorSelectCol = p
b2a0: 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  NewExpr->pLeft =
b2b0: 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67 68   pNewExpr->pRigh
b2c0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
b2d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b2e0: 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  i>0 );.        a
b2f0: 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31 5d  ssert( pItem[-1]
b300: 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  .pExpr!=0 );.   
b310: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
b320: 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  wExpr->iColumn==
b330: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d  pItem[-1].pExpr-
b340: 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20  >iColumn+1 );.  
b350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
b360: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d 70  riorSelectCol==p
b370: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e  Item[-1].pExpr->
b380: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20  pLeft );.       
b390: 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74   pNewExpr->pLeft
b3a0: 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43   = pPriorSelectC
b3b0: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
b3c0: 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  }.    pItem->zNa
b3d0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
b3e0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b3f0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
b400: 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71  Item->zSpan = sq
b410: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b420: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61  , pOldItem->zSpa
b430: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73  n);.    pItem->s
b440: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49  ortOrder = pOldI
b450: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
b460: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
b470: 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  = 0;.    pItem->
b480: 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c  bSpanIsTab = pOl
b490: 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  dItem->bSpanIsTa
b4a0: 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20  b;.    pItem->u 
b4b0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20  = pOldItem->u;. 
b4c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
b4d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75  ;.}../*.** If cu
b4e0: 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c  rsors, triggers,
b4f0: 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75   views and subqu
b500: 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d  eries are all om
b510: 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  itted from.** th
b520: 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f  e build, then no
b530: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
b540: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78  ing routines, ex
b550: 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c  cept for .** sql
b560: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c  ite3SelectDup(),
b570: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
b580: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
b590: 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a  () is sometimes.
b5a0: 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  ** called with a
b5b0: 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a   NULL argument..
b5c0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
b5d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
b5e0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
b5f0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
b600: 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65  R) \. || !define
b610: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
b620: 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20  BQUERY).SrcList 
b630: 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  *sqlite3SrcListD
b640: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
b650: 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  SrcList *p, int 
b660: 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73  flags){.  SrcLis
b670: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
b680: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
b690: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
b6a0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
b6b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
b6c0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
b6d0: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
b6e0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
b6f0: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
b700: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
b710: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
b720: 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
b730: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
b740: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
b750: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
b760: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
b770: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
b780: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
b790: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
b7a0: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
b7b0: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
b7c0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
b7d0: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
b7e0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c  ->a[i];.    Tabl
b7f0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65  e *pTab;.    pNe
b800: 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d  wItem->pSchema =
b810: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65   pOldItem->pSche
b820: 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ma;.    pNewItem
b830: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
b840: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b850: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  , pOldItem->zDat
b860: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
b870: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
b880: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b890: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
b8a0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
b8b0: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
b8c0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b8d0: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
b8e0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b8f0: 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66  fg = pOldItem->f
b900: 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  g;.    pNewItem-
b910: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
b920: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
b930: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72    pNewItem->addr
b940: 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74  FillSub = pOldIt
b950: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b  em->addrFillSub;
b960: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72  .    pNewItem->r
b970: 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49  egReturn = pOldI
b980: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
b990: 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d      if( pNewItem
b9a0: 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
b9b0: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74   ){.      pNewIt
b9c0: 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
b9d0: 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  y = sqlite3DbStr
b9e0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b9f0: 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29  ->u1.zIndexedBy)
ba00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
ba10: 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d  Item->pIBIndex =
ba20: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e   pOldItem->pIBIn
ba30: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  dex;.    if( pNe
ba40: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  wItem->fg.isTabF
ba50: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  unc ){.      pNe
ba60: 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  wItem->u1.pFuncA
ba70: 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  rg = .          
ba80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
ba90: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
baa0: 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c  >u1.pFuncArg, fl
bab0: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
bac0: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
bad0: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
bae0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
baf0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
bb00: 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
bb10: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65     }.    pNewIte
bb20: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
bb30: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
bb40: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c  , pOldItem->pSel
bb50: 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ect, flags);.   
bb60: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
bb70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
bb80: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  db, pOldItem->pO
bb90: 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  n, flags);.    p
bba0: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
bbb0: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
bbc0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
bbd0: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
bbe0: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
bbf0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
bc00: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
bc10: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
bc20: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
bc30: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
bc40: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
bc50: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
bc60: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64  t i;.  assert( d
bc70: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
bc80: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bc90: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
bca0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
bcb0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
bcc0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
bcd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
bce0: 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64  ew->nId = p->nId
bcf0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
bd00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
bd10: 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69  NN(db, p->nId*si
bd20: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
bd30: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
bd40: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
bd50: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65  DbFreeNN(db, pNe
bd60: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
bd70: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
bd80: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
bd90: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
bda0: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
bdb0: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
bdc0: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
bdd0: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
bde0: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
bdf0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
be00: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
be10: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
be20: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
be30: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
be40: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
be50: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
be60: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
be70: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
be80: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
be90: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
bea0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
beb0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
bec0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
bed0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bee0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
bef0: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
bf00: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
bf10: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
bf20: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
bf30: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
bf40: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
bf50: 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  pDup, int flags)
bf60: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65 74  {.  Select *pRet
bf70: 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a   = 0;.  Select *
bf80: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c  pNext = 0;.  Sel
bf90: 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65 74  ect **pp = &pRet
bfa0: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a  ;.  Select *p;..
bfb0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
bfc0: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70 3b  );.  for(p=pDup;
bfd0: 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29   p; p=p->pPrior)
bfe0: 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
bff0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
c000: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c010: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20  zeof(*p) );.    
c020: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 72  if( pNew==0 ) br
c030: 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  eak;.    pNew->p
c040: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
c050: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
c060: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
c070: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63  ;.    pNew->pSrc
c080: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
c090: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
c0a0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c0b0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
c0c0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
c0d0: 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73  p->pWhere, flags
c0e0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72  );.    pNew->pGr
c0f0: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
c100: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
c110: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67  ->pGroupBy, flag
c120: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48  s);.    pNew->pH
c130: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
c140: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
c150: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
c160: 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42     pNew->pOrderB
c170: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
c180: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
c190: 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a  rderBy, flags);.
c1a0: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70      pNew->op = p
c1b0: 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ->op;.    pNew->
c1c0: 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pNext = pNext;. 
c1d0: 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
c1e0: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  = 0;.    pNew->p
c1f0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
c200: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
c210: 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  imit, flags);.  
c220: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
c230: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f   0;.    pNew->iO
c240: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
c250: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
c260: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
c270: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
c280: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  .    pNew->addrO
c290: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
c2a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  .    pNew->addrO
c2b0: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b  penEphm[1] = -1;
c2c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65  .    pNew->nSele
c2d0: 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65  ctRow = p->nSele
c2e0: 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d  ctRow;.    pNew-
c2f0: 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70  >pWith = withDup
c300: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
c310: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c320: 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70  tSetName(pNew, p
c330: 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20  ->zSelName);.   
c340: 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20   *pp = pNew;.   
c350: 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72   pp = &pNew->pPr
c360: 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d  ior;.    pNext =
c370: 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65   pNew;.  }..  re
c380: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
c390: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
c3a0: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
c3b0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
c3c0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
c3d0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
c3e0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
c3f0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
c400: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
c410: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
c420: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
c430: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
c440: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
c450: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
c460: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
c470: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
c480: 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20 6d  pList argument m
c490: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 55  ust be either NU
c4a0: 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  LL or a pointer 
c4b0: 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a 2a  to an ExprList.*
c4c0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
c4d0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
c4e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c4f0: 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20 72  ppend().  This r
c500: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e 6f  outine.** may no
c510: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
c520: 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61 69  n ExprList obtai
c530: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
c540: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a  ExprListDup()..*
c550: 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73 20  * Reason:  This 
c560: 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20  routine assumes 
c570: 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
c580: 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69 73  of slots in pLis
c590: 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20 70  t->a[].** is a p
c5a0: 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54 68  ower of two.  Th
c5b0: 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20 73  at is true for s
c5c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
c5d0: 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a 2a  pend() returns.*
c5e0: 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65 63  * but is not nec
c5f0: 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66 72  essarily true fr
c600: 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  om the return va
c610: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45 78  lue of sqlite3Ex
c620: 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a 0a  prListDup()..**.
c630: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
c640: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
c650: 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69  occurs, the enti
c660: 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64  re list is freed
c670: 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20   and.** NULL is 
c680: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f  returned.  If no
c690: 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  n-NULL is return
c6a0: 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  ed, then it is g
c6b0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61  uaranteed.** tha
c6c0: 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  t the new entry 
c6d0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
c6e0: 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78   appended..*/.Ex
c6f0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
c700: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
c710: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c720: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
c730: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c740: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
c750: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
c760: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
c770: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
c780: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
c790: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
c7a0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
c7b0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
c7c0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
c7d0: 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
c7e0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
c7f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c800: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
c810: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
c820: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
c830: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
c840: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c850: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
c860: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
c870: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
c880: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
c890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
c8a0: 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20  t->nExpr = 0;.  
c8b0: 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74  }else if( (pList
c8c0: 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74  ->nExpr & (pList
c8d0: 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29  ->nExpr-1))==0 )
c8e0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
c8f0: 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
c900: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
c910: 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20 20  c(db, pList, .  
c920: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
c930: 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c 69  f(*pList)+(2*pLi
c940: 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a 73  st->nExpr - 1)*s
c950: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
c960: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ]));.    if( pNe
c970: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  w==0 ){.      go
c980: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
c990: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
c9a0: 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  w;.  }.  pItem =
c9b0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
c9c0: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73  ->nExpr++];.  as
c9d0: 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73  sert( offsetof(s
c9e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c9f0: 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65  tem,zName)==size
ca00: 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  of(pItem->pExpr)
ca10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
ca20: 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78  fsetof(struct Ex
ca30: 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78 70  prList_item,pExp
ca40: 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  r)==0 );.  memse
ca50: 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  t(&pItem->zName,
ca60: 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  0,sizeof(*pItem)
ca70: 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74  -offsetof(struct
ca80: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a   ExprList_item,z
ca90: 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d  Name));.  pItem-
caa0: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
cab0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
cac0: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
cad0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
cae0: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
caf0: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
cb00: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
cb10: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
cb20: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
cb30: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
cb40: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
cb50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d  .}../*.** pColum
cb60: 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72  ns and pExpr for
cb70: 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69 67  m a vector assig
cb80: 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 70  nment which is p
cb90: 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a  art of the SET.*
cba0: 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55  * clause of an U
cbb0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
cbc0: 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
cbd0: 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63  **        (a,b,c
cbe0: 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32  ) = (expr1,expr2
cbf0: 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20  ,expr3).** Or:  
cc00: 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c    (a,b,c) = (SEL
cc10: 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e  ECT x,y,z FROM .
cc20: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ...).**.** For e
cc30: 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
cc40: 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e  vector assignmen
cc50: 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e  t, append new en
cc60: 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  tries to the.** 
cc70: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
cc80: 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63  pList.  In the c
cc90: 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65 72  ase of a subquer
cca0: 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70  y on the RHS, ap
ccb0: 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43  pend.** TK_SELEC
ccc0: 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73  T_COLUMN express
ccd0: 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  ions..*/.ExprLis
cce0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
ccf0: 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a  stAppendVector(.
cd00: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
cd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
cd20: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
cd30: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
cd40: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
cd50: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
cd60: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
cd70: 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  L */.  IdList *p
cd80: 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a  Columns,      /*
cd90: 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f   List of names o
cda0: 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73  f LHS of the ass
cdb0: 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  ignment */.  Exp
cdc0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
cdd0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78      /* Vector ex
cde0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
cdf0: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
ce00: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
ce10: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
ce20: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
ce30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
ce40: 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20   iFirst = pList 
ce50: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
ce60: 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e   0;.  /* pColumn
ce70: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55  s can only be NU
ce80: 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d  LL due to an OOM
ce90: 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c   but an OOM will
cea0: 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65   cause an.  ** e
ceb0: 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69  xit prior to thi
cec0: 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20  s routine being 
ced0: 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28  invoked */.  if(
cee0: 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d   NEVER(pColumns=
cef0: 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f  =0) ) goto vecto
cf00: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a  r_append_error;.
cf10: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
cf20: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
cf30: 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a  end_error;..  /*
cf40: 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61   If the RHS is a
cf50: 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65   vector, then we
cf60: 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79   can immediately
cf70: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
cf80: 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a  at .  ** the siz
cf90: 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64  e of the RHS and
cfa0: 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74   LHS match.  But
cfb0: 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 61   if the RHS is a
cfc0: 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77   SELECT, .  ** w
cfd0: 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20 69  ildcards ("*") i
cfe0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
cff0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d   of the SELECT m
d000: 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
d010: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63  before.  ** we c
d020: 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63  an do the size c
d030: 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74  heck, so defer t
d040: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e  he size check un
d050: 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
d060: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
d070: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45  pExpr->op!=TK_SE
d080: 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73  LECT && pColumns
d090: 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65  ->nId!=(n=sqlite
d0a0: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
d0b0: 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73  pExpr)) ){.    s
d0c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d0d0: 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d  Parse, "%d colum
d0e0: 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76  ns assigned %d v
d0f0: 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20  alues",.        
d100: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
d110: 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20  umns->nId, n);. 
d120: 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61     goto vector_a
d130: 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d  ppend_error;.  }
d140: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
d150: 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b  Columns->nId; i+
d160: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53  +){.    Expr *pS
d170: 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ubExpr = sqlite3
d180: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
d190: 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ld(pParse, pExpr
d1a0: 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  , i);.    pList 
d1b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
d1c0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
d1d0: 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72 29  pList, pSubExpr)
d1e0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
d1f0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d200: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69   pList->nExpr==i
d210: 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20  First+i+1 );.   
d220: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73     pList->a[pLis
d230: 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  t->nExpr-1].zNam
d240: 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b  e = pColumns->a[
d250: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
d260: 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a  pColumns->a[i].z
d270: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Name = 0;.    }.
d280: 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e    }..  if( !db->
d290: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
d2a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
d2b0: 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53 28 70  LECT && ALWAYS(p
d2c0: 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
d2d0: 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20 70  Expr *pFirst = p
d2e0: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e  List->a[iFirst].
d2f0: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
d300: 74 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b 0a  t( pFirst!=0 );.
d310: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72      assert( pFir
d320: 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  st->op==TK_SELEC
d330: 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  T_COLUMN );.    
d340: 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74   .    /* Store t
d350: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
d360: 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f  ent in pRight so
d370: 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65   it will be dele
d380: 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  ted when.    ** 
d390: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
d3a0: 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65  elete() is calle
d3b0: 64 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d  d */.    pFirst-
d3c0: 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b  >pRight = pExpr;
d3d0: 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a  .    pExpr = 0;.
d3e0: 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72  .    /* Remember
d3f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d400: 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20 73   LHS in iTable s
d410: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 68  o that we can ch
d420: 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  eck that.    ** 
d430: 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20  the RHS and LHS 
d440: 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69  sizes match duri
d450: 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ng code generati
d460: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72 73  on. */.    pFirs
d470: 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c  t->iTable = pCol
d480: 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a  umns->nId;.  }..
d490: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
d4a0: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ror:.  sqlite3Ex
d4b0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
d4c0: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  pr);.  sqlite3Id
d4d0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
d4e0: 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75  Columns);.  retu
d4f0: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
d500: 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74 20  ** Set the sort 
d510: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61  order for the la
d520: 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68  st element on th
d530: 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74  e given ExprList
d540: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d550: 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74  3ExprListSetSort
d560: 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a  Order(ExprList *
d570: 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65  p, int iSortOrde
d580: 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  r){.  if( p==0 )
d590: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
d5a0: 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44  t( SQLITE_SO_UND
d5b0: 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49  EFINED<0 && SQLI
d5c0: 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20  TE_SO_ASC>=0 && 
d5d0: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30  SQLITE_SO_DESC>0
d5e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
d5f0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66  >nExpr>0 );.  if
d600: 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29  ( iSortOrder<0 )
d610: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
d620: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
d630: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
d640: 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72  _SO_ASC );.    r
d650: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e  eturn;.  }.  p->
d660: 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f  a[p->nExpr-1].so
d670: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53  rtOrder = (u8)iS
d680: 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a  ortOrder;.}../*.
d690: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
d6a0: 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c  ist.a[].zName el
d6b0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
d6c0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
d6d0: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
d6e0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
d6f0: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
d700: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
d710: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
d720: 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68  r.  But pName sh
d730: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
d740: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
d750: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
d760: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
d770: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
d780: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
d790: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d7a0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
d7b0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
d7c0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
d7d0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d7e0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d7f0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
d800: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
d810: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
d820: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
d830: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
d840: 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20  ame to be added 
d850: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d870: 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68  True to cause th
d880: 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71  e name to be deq
d890: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  uoted */.){.  as
d8a0: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
d8b0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
d8c0: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
d8d0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
d8e0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d8f0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
d900: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
d910: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
d920: 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73     pItem = &pLis
d930: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
d940: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
d950: 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
d960: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  0 );.    pItem->
d970: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
d980: 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d  bStrNDup(pParse-
d990: 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  >db, pName->z, p
d9a0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66  Name->n);.    if
d9b0: 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69  ( dequote ) sqli
d9c0: 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d  te3Dequote(pItem
d9d0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a  ->zName);.  }.}.
d9e0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
d9f0: 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61  xprList.a[].zSpa
da00: 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  n element of the
da10: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
da20: 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20  dded item.** on 
da30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
da40: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ist..**.** pList
da50: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66   might be NULL f
da60: 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20  ollowing an OOM 
da70: 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61  error.  But pSpa
da80: 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  n should never b
da90: 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61  e.** NULL.  If a
daa0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
dab0: 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50  on fails, the pP
dac0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
dad0: 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69  Failed flag.** i
dae0: 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s set..*/.void s
daf0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
db00: 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a  tSpan(.  Parse *
db10: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
db20: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
db30: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
db40: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
db50: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
db60: 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61  h to add the spa
db70: 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e  n. */.  ExprSpan
db80: 20 2a 70 53 70 61 6e 20 20 20 20 20 20 20 20 20   *pSpan         
db90: 2f 2a 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62  /* The span to b
dba0: 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20  e added */.){.  
dbb0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
dbc0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
dbd0: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
dbe0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
dbf0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
dc00: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
dc10: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
dc20: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
dc30: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
dc40: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
dc50: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
dc60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
dc70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
dc80: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70   pItem->pExpr==p
dc90: 53 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Span->pExpr );. 
dca0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
dcb0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
dcc0: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  n);.    pItem->z
dcd0: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
dce0: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
dcf0: 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74  r*)pSpan->zStart
dd00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61        (int)(pSpa
dd30: 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d  n->zEnd - pSpan-
dd40: 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d  >zStart));.  }.}
dd50: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
dd60: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
dd70: 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d  EList contains m
dd80: 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20  ore than iLimit 
dd90: 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61  elements,.** lea
dda0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
ddb0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
ddc0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
ddd0: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
dde0: 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  h(.  Parse *pPar
ddf0: 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
de00: 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20  pEList,.  const 
de10: 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b  char *zObject.){
de20: 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72  .  int mx = pPar
de30: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
de40: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
de50: 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  MN];.  testcase(
de60: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
de70: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a  t->nExpr==mx );.
de80: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
de90: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
dea0: 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69  xpr==mx+1 );.  i
deb0: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
dec0: 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b  ist->nExpr>mx ){
ded0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
dee0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
def0: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
df00: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
df10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
df20: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65  lete an entire e
df30: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
df40: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
df50: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65  _NOINLINE void e
df60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
df70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
df80: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
df90: 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e   int i = pList->
dfa0: 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20  nExpr;.  struct 
dfb0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
dfc0: 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61  Item =  pList->a
dfd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
dfe0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
dff0: 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  do{.    sqlite3E
e000: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
e010: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
e020: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e030: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
e040: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e050: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e060: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
e070: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d  ++;.  }while( --
e080: 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  i>0 );.  sqlite3
e090: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
e0a0: 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  st);.}.void sqli
e0b0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
e0c0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
e0d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
e0e0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 65  .  if( pList ) e
e0f0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
e100: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
e110: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
e120: 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c  bitwise-OR of al
e130: 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65  l Expr.flags fie
e140: 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e  lds in the given
e150: 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  .** ExprList..*/
e160: 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70 72  .u32 sqlite3Expr
e170: 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20  ListFlags(const 
e180: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e190: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32  {.  int i;.  u32
e1a0: 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74   m = 0;.  assert
e1b0: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
e1c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
e1d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
e1e0: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
e1f0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
e200: 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72 74  xpr;.     assert
e210: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
e220: 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66     m |= pExpr->f
e230: 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75  lags;.  }.  retu
e240: 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn m;.}../*.** T
e250: 68 69 73 20 69 73 20 61 20 53 45 4c 45 43 54 2d  his is a SELECT-
e260: 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f  node callback fo
e270: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
e280: 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20   walker that.** 
e290: 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e 20  always "fails". 
e2a0: 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74 68   By "fail" in th
e2b0: 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61 6e  is case, we mean
e2c0: 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d   set.** pWalker-
e2d0: 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61  >eCode to zero a
e2e0: 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20  nd abort..**.** 
e2f0: 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73  This callback is
e300: 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70 6c   used by multipl
e310: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c  e expression wal
e320: 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  kers..*/.int sql
e330: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
e340: 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  il(Walker *pWalk
e350: 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  er, Select *NotU
e360: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
e370: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
e380: 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  );.  pWalker->eC
e390: 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ode = 0;.  retur
e3a0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a  n WRC_Abort;.}..
e3b0: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  /*.** These rout
e3c0: 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20  ines are Walker 
e3d0: 63 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74  callbacks used t
e3e0: 6f 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69  o check expressi
e3f0: 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66  ons to.** see if
e400: 20 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74   they are "const
e410: 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65  ant" for some de
e420: 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73  finition of cons
e430: 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61  tant.  The.** Wa
e440: 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65  lker.eCode value
e450: 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20   determines the 
e460: 74 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e  type of "constan
e470: 74 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  t" we are lookin
e480: 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20  g.** for..**.** 
e490: 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72  These callback r
e4a0: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
e4b0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
e4c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
e4d0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
e4e0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20  prIsConstant()  
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
e510: 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  1.**     sqlite3
e520: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
e530: 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20  tJoin()         
e540: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
e550: 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ==2.**     sqlit
e560: 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
e570: 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20  stant()         
e580: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
e590: 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c  de==3.**     sql
e5a0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
e5b0: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20  ntOrFunction()  
e5c0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e5d0: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a  Code==4 or 5.**.
e5e0: 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  ** In all cases,
e5f0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73   the callbacks s
e600: 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d  et Walker.eCode=
e610: 30 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74  0 and abort if t
e620: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
e630: 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74   is found to not
e640: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a   be a constant..
e650: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
e660: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
e670: 72 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75  rFunction() is u
e680: 73 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69  sed for evaluati
e690: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  ng expressions.*
e6a0: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
e6b0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
e6c0: 54 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  The Walker.eCode
e6d0: 20 76 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e   value is 5 when
e6e0: 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65   parsing.** an e
e6f0: 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61  xisting schema a
e700: 6e 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73  nd 4 when proces
e710: 73 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65  sing a new state
e720: 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a  ment.  A bound.*
e730: 2a 20 70 61 72 61 6d 65 74 65 72 20 72 61 69 73  * parameter rais
e740: 65 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  es an error for 
e750: 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20  new statements, 
e760: 62 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20  but is silently 
e770: 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20  converted.** to 
e780: 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e  NULL for existin
e790: 67 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73  g schemas.  This
e7a0: 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d   allows sqlite_m
e7b0: 61 73 74 65 72 20 74 61 62 6c 65 73 20 74 68 61  aster tables tha
e7c0: 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20  t .** contain a 
e7d0: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
e7e0: 62 65 63 61 75 73 65 20 74 68 65 79 20 77 65 72  because they wer
e7f0: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f  e generated by o
e800: 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  lder versions.**
e810: 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65   of SQLite to be
e820: 20 70 61 72 73 65 64 20 62 79 20 6e 65 77 65 72   parsed by newer
e830: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
e840: 69 74 65 20 77 69 74 68 6f 75 74 20 72 61 69 73  ite without rais
e850: 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d  ing a.** malform
e860: 65 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e  ed schema error.
e870: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
e880: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
e890: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
e8a0: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
e8b0: 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65  ..  /* If pWalke
e8c0: 72 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68  r->eCode is 2 th
e8d0: 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74  en any term of t
e8e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
e8f0: 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20  at comes from.  
e900: 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  ** the ON or USI
e910: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
e920: 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61  left join disqua
e930: 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65  lifies the expre
e940: 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20  ssion.  ** from 
e950: 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64  being considered
e960: 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20   constant. */.  
e970: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
e980: 64 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73  de==2 && ExprHas
e990: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
e9a0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
e9b0: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
e9c0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  de = 0;.    retu
e9d0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
e9e0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
e9f0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
ea00: 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69   Consider functi
ea10: 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61  ons to be consta
ea20: 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20  nt if all their 
ea30: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f  arguments are co
ea40: 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e  nstant.    ** an
ea50: 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72  d either pWalker
ea60: 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20  ->eCode==4 or 5 
ea70: 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  or the function 
ea80: 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53  has the.    ** S
ea90: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
eaa0: 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61   flag. */.    ca
eab0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
eac0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
ead0: 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45  r->eCode>=4 || E
eae0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
eaf0: 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e  Expr,EP_ConstFun
eb00: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  c) ){.        re
eb10: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
eb20: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
eb30: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
eb40: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
eb50: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
eb60: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
eb70: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
eb80: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
eb90: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
eba0: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
ebb0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
ebc0: 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  MN:.      testca
ebd0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
ebe0: 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65  K_ID );.      te
ebf0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
ec00: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
ec10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ec20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
ec30: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
ec40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
ec50: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
ec60: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
ec70: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
ec80: 64 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e  de==3 && pExpr->
ec90: 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d  iTable==pWalker-
eca0: 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20  >u.iCur ){.     
ecb0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
ecc0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
ecd0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
ece0: 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
ecf0: 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  e TK_IF_NULL_ROW
ed00: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
ed10: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
ed20: 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20  IF_NULL_ROW );. 
ed30: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
ed40: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ode = 0;.      r
ed50: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
ed60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
ed70: 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28  IABLE:.      if(
ed80: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
ed90: 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =5 ){.        /*
eda0: 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   Silently conver
edb0: 74 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  t bound paramete
edc0: 72 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  rs that appear i
edd0: 6e 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a  nside of CREATE.
ede0: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65          ** state
edf0: 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c  ments into a NUL
ee00: 4c 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74  L when parsing t
ee10: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
ee20: 65 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20  ent text out.   
ee30: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73       ** of the s
ee40: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
ee50: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45  le */.        pE
ee60: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
ee70: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
ee80: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
ee90: 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  e==4 ){.        
eea0: 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d  /* A bound param
eeb0: 65 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45  eter in a CREATE
eec0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
eed0: 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a  originates from.
eee0: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
eef0: 65 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75  e3_prepare() cau
ef00: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ses an error */.
ef10: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
ef20: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
ef30: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
ef40: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
ef50: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
ef60: 75 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75  ugh */.    defau
ef70: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
ef80: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
ef90: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
efa0: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
efb0: 46 61 69 6c 20 77 69 6c 6c 20 64 69 73 61 6c 6c  Fail will disall
efc0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ow */.      test
efd0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
efe0: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a  =TK_EXISTS ); /*
eff0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
f000: 6c 6b 46 61 69 6c 20 77 69 6c 6c 20 64 69 73 61  lkFail will disa
f010: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65  llow */.      re
f020: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
f030: 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  e;.  }.}.static 
f040: 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28  int exprIsConst(
f050: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69  Expr *p, int ini
f060: 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29  tFlag, int iCur)
f070: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
f080: 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c  w.eCode = initFl
f090: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
f0a0: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
f0b0: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
f0c0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
f0d0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  = sqlite3SelectW
f0e0: 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20  alkFail;.#ifdef 
f0f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77  SQLITE_DEBUG.  w
f100: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
f110: 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  2 = sqlite3Selec
f120: 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65  tWalkAssert2;.#e
f130: 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75 72 20  ndif.  w.u.iCur 
f140: 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65  = iCur;.  sqlite
f150: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
f160: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
f170: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  de;.}../*.** Wal
f180: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
f190: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
f1a0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
f1b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
f1c0: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
f1d0: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
f1e0: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
f1f0: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
f200: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
f210: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
f220: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
f230: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
f240: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
f250: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
f260: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
f270: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
f280: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
f290: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
f2a0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
f2b0: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
f2c0: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
f2d0: 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b  sConst(p, 1, 0);
f2e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
f2f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
f300: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
f310: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
f320: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
f330: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
f340: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
f350: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
f360: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
f370: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
f380: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
f390: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
f3a0: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
f3b0: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
f3c0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
f3d0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
f3e0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
f3f0: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
f400: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
f410: 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a  Const(p, 2, 0);.
f420: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
f430: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
f440: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
f450: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
f460: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
f470: 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67  .** for any sing
f480: 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61  le row of the ta
f490: 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
f4a0: 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20  iCur.  In other 
f4b0: 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78  words, the.** ex
f4c0: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f  pression must no
f4d0: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e  t refer to any n
f4e0: 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
f4f0: 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e   function nor an
f500: 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72  y.** table other
f510: 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69   than iCur..*/.i
f520: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
f530: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78  TableConstant(Ex
f540: 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29  pr *p, int iCur)
f550: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
f560: 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75  sConst(p, 3, iCu
f570: 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71  r);.}.../*.** sq
f580: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20  lite3WalkExpr() 
f590: 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
f5a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f5b0: 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28  nstantOrGroupBy(
f5c0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
f5d0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
f5e0: 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 57 61 6c  antOrGroupBy(Wal
f5f0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
f600: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78  pr *pExpr){.  Ex
f610: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
f620: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47   = pWalker->u.pG
f630: 72 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b  roupBy;.  int i;
f640: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
f650: 70 45 78 70 72 20 69 73 20 69 64 65 6e 74 69 63  pExpr is identic
f660: 61 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55 50 20  al to any GROUP 
f670: 42 59 20 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20  BY term. If so, 
f680: 63 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20 69 74  consider.  ** it
f690: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20   constant.  */. 
f6a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
f6b0: 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
f6c0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
f6d0: 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e   pGroupBy->a[i].
f6e0: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
f6f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
f700: 65 28 30 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d  e(0, pExpr, p, -
f710: 31 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 43 6f  1)<2 ){.      Co
f720: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
f730: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
f740: 53 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61  Seq(pWalker->pPa
f750: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69  rse, p);.      i
f760: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
f770: 6d 70 28 22 42 49 4e 41 52 59 22 2c 20 70 43 6f  mp("BINARY", pCo
f780: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ll->zName)==0 ){
f790: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f7a0: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
f7b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
f7c0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78 70  /* Check if pExp
f7d0: 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  r is a sub-selec
f7e0: 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64  t. If so, consid
f7f0: 65 72 20 69 74 20 76 61 72 69 61 62 6c 65 2e 20  er it variable. 
f800: 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  */.  if( ExprHas
f810: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f820: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
f830: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
f840: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ode = 0;.    ret
f850: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
f860: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65 78 70   }..  return exp
f870: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
f880: 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b  pWalker, pExpr);
f890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74  .}../*.** Walk t
f8a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
f8b0: 65 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ee passed as the
f8c0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
f8d0: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
f8e0: 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65  .** if the expre
f8f0: 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20 65  ssion consists e
f900: 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74  ntirely of const
f910: 61 6e 74 73 20 6f 72 20 63 6f 70 69 65 73 20 6f  ants or copies o
f920: 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20 70  f terms .** in p
f930: 47 72 6f 75 70 42 79 20 74 68 61 74 20 73 6f 72  GroupBy that sor
f940: 74 20 77 69 74 68 20 74 68 65 20 42 49 4e 41 52  t with the BINAR
f950: 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  Y collation sequ
f960: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ence..**.** This
f970: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
f980: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
f990: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48   a term of the H
f9a0: 41 56 49 4e 47 20 63 6c 61 75 73 65 20 63 61 6e  AVING clause can
f9b0: 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64 20  .** be promoted 
f9c0: 69 6e 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  into the WHERE c
f9d0: 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65 72  lause.  In order
f9e0: 20 66 6f 72 20 73 75 63 68 20 61 20 70 72 6f 6d   for such a prom
f9f0: 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a  otion to work,.*
fa00: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
fa10: 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
fa20: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 68   term must be th
fa30: 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20 6d  e same for all m
fa40: 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20 22  embers of.** a "
fa50: 67 72 6f 75 70 22 2e 20 20 54 68 65 20 72 65 71  group".  The req
fa60: 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68  uirement that th
fa70: 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20  e GROUP BY term 
fa80: 6d 75 73 74 20 62 65 20 42 49 4e 41 52 59 0a 2a  must be BINARY.*
fa90: 2a 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 6e  * assumes that n
faa0: 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e  o other collatin
fab0: 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  g sequence will 
fac0: 68 61 76 65 20 61 20 66 69 6e 65 72 2d 67 72 61  have a finer-gra
fad0: 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e 67  ined.** grouping
fae0: 20 74 68 61 6e 20 62 69 6e 61 72 79 2e 20 20 49   than binary.  I
faf0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 28 41  n other words (A
fb00: 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72  =B COLLATE binar
fb10: 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d  y) implies.** A=
fb20: 42 20 69 6e 20 65 76 65 72 79 20 6f 74 68 65 72  B in every other
fb30: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
fb40: 6e 63 65 2e 20 20 54 68 65 20 72 65 71 75 69 72  nce.  The requir
fb50: 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 0a 2a  ement that the.*
fb60: 2a 20 47 52 4f 55 50 20 42 59 20 62 65 20 42 49  * GROUP BY be BI
fb70: 4e 41 52 59 20 69 73 20 73 74 72 69 63 74 65 72  NARY is stricter
fb80: 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e   than necessary.
fb90: 20 20 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f 20    It would also 
fba0: 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f  work.** to promo
fbb0: 74 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  te HAVING clause
fbc0: 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 73  s that use the s
fbd0: 61 6d 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ame alternative 
fbe0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
fbf0: 75 65 6e 63 65 20 61 73 20 74 68 65 20 47 52 4f  uence as the GRO
fc00: 55 50 20 42 59 20 74 65 72 6d 2c 20 62 75 74 20  UP BY term, but 
fc10: 74 68 61 74 20 69 73 20 6d 75 63 68 20 68 61 72  that is much har
fc20: 64 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a  der to check,.**
fc30: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
fc40: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
fc50: 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61   are uncommon, a
fc60: 6e 64 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20  nd this is only 
fc70: 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  an.** optimizati
fc80: 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65 20 74  on, so we take t
fc90: 68 65 20 65 61 73 79 20 77 61 79 20 6f 75 74 20  he easy way out 
fca0: 61 6e 64 20 73 69 6d 70 6c 79 20 72 65 71 75 69  and simply requi
fcb0: 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20  re the.** GROUP 
fcc0: 42 59 20 74 6f 20 75 73 65 20 74 68 65 20 42 49  BY to use the BI
fcd0: 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73  NARY collating s
fce0: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20  equence..*/.int 
fcf0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
fd00: 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 50  stantOrGroupBy(P
fd10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
fd20: 70 72 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20  pr *p, ExprList 
fd30: 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20 20 57 61  *pGroupBy){.  Wa
fd40: 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64  lker w;.  w.eCod
fd50: 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
fd60: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
fd70: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  odeIsConstantOrG
fd80: 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78 53 65 6c  roupBy;.  w.xSel
fd90: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
fda0: 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70 42 79 20  .  w.u.pGroupBy 
fdb0: 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e  = pGroupBy;.  w.
fdc0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
fdd0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
fde0: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
fdf0: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
fe00: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
fe10: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
fe20: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
fe30: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
fe40: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
fe50: 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63   or a function c
fe60: 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e  all with constan
fe70: 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
fe80: 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68  turn and 0 if th
fe90: 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76  ere.** are any v
fea0: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
feb0: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
fec0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
fed0: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
fee0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
fef0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
ff00: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
ff10: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
ff20: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
ff30: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
ff40: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
ff50: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
ff60: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
ff70: 6e 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73  n(Expr *p, u8 is
ff80: 49 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28  Init){.  assert(
ff90: 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73   isInit==0 || is
ffa0: 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Init==1 );.  ret
ffb0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
ffc0: 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b  p, 4+isInit, 0);
ffd0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
ffe0: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
fff0: 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  HINTS./*.** Walk
10000 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
10010 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
10020 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10030 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73   contains a.** s
10040 75 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20  ubquery of some 
10050 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20  kind.  Return 0 
10060 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
10070 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69  subqueries..*/.i
10080 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
10090 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79 28 45  ntainsSubquery(E
100a0 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65  xpr *p){.  Walke
100b0 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  r w;.  w.eCode =
100c0 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   1;.  w.xExprCal
100d0 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
100e0 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
100f0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
10100 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10110 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66  WalkFail;.#ifdef
10120 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
10130 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
10140 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  k2 = sqlite3Sele
10150 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23  ctWalkAssert2;.#
10160 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 57  endif.  sqlite3W
10170 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a  alkExpr(&w, p);.
10180 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65    return w.eCode
10190 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ==0;.}.#endif../
101a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
101b0 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61  ession p codes a
101c0 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65   constant intege
101d0 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20  r that is small 
101e0 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74  enough.** to fit
101f0 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74   in a 32-bit int
10200 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61  eger, return 1 a
10210 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65  nd put the value
10220 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a   of the integer.
10230 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20  ** in *pValue.  
10240 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
10250 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  n is not an inte
10260 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20  ger or if it is 
10270 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69  too big.** to fi
10280 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  t in a signed 32
10290 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
102a0 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65  turn 0 and leave
102b0 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67   *pValue unchang
102c0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
102d0 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
102e0 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56  Expr *p, int *pV
102f0 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  alue){.  int rc 
10300 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  = 0;.  if( p==0 
10310 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
10320 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  Can only happen 
10330 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d  following on OOM
10340 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   */..  /* If an 
10350 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
10360 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c   integer literal
10370 20 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20   that fits in a 
10380 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20  signed 32-bit.  
10390 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  ** integer, then
103a0 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65   the EP_IntValue
103b0 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20   flag will have 
103c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74  already been set
103d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
103e0 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op!=TK_INTEGER 
103f0 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45  || (p->flags & E
10400 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20  P_IntValue)!=0. 
10410 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
10420 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e  ite3GetInt32(p->
10430 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d  u.zToken, &rc)==
10440 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66  0 );..  if( p->f
10450 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
10460 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75  ue ){.    *pValu
10470 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b  e = p->u.iValue;
10480 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
10490 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e   }.  switch( p->
104a0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
104b0 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
104c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70   rc = sqlite3Exp
104d0 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
104e0 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
104f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10500 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
10510 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
10520 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
10530 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
10540 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
10550 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
10560 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33  rt( v!=(-2147483
10570 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  647-1) );.      
10580 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
10590 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
105a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
105b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
105c0 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
105d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
105e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
105f0 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69  FALSE if there i
10600 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
10610 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10620 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  can be NULL..**.
10630 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
10640 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55  sion might be NU
10650 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  LL or if the exp
10660 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63  ression is too c
10670 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c  omplex.** to tel
10680 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  l return TRUE.  
10690 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
106a0 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61  ine is used as a
106b0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
106c0 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c  to skip OP_IsNul
106d0 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65  l opcodes.** whe
106e0 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  n we know that a
106f0 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
10700 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61   NULL.  Hence, a
10710 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a   false positive.
10720 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52  ** (returning TR
10730 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20  UE when in fact 
10740 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
10750 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c  an never be NULL
10760 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20  ) might.** be a 
10770 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63  small performanc
10780 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68  e hit but is oth
10790 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e  erwise harmless.
107a0 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a    On the other.*
107b0 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20  * hand, a false 
107c0 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e  negative (return
107d0 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74  ing FALSE when t
107e0 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20  he result could 
107f0 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c  be NULL).** will
10800 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
10810 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61  n an incorrect a
10820 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20  nswer.  So when 
10830 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
10840 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74  .** TRUE..*/.int
10850 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
10860 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72  eNull(const Expr
10870 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20   *p){.  u8 op;. 
10880 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
10890 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
108a0 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
108b0 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
108c0 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
108d0 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
108e0 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
108f0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
10900 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
10910 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20  TEGER:.    case 
10920 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63  TK_STRING:.    c
10930 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
10940 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a    case TK_BLOB:.
10950 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10960 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
10970 4d 4e 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  MN:.      return
10980 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
10990 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c  (p, EP_CanBeNull
109a0 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
109b0 20 20 70 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20    p->pTab==0 || 
109c0 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f   /* Reference to
109d0 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
109e0 20 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   on expression *
109f0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  /.             (
10a00 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26  p->iColumn>=0 &&
10a10 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   p->pTab->aCol[p
10a20 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  ->iColumn].notNu
10a30 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61  ll==0);.    defa
10a40 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
10a50 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
10a60 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
10a70 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
10a80 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74  ssion is a const
10a90 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ant which would 
10aa0 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  be.** unchanged 
10ab0 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77  by OP_Affinity w
10ac0 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79  ith the affinity
10ad0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
10ae0 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
10af0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10b00 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
10b10 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
10b20 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65   OP_Affinity ope
10b30 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  ration.** can be
10b40 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20   omitted.  When 
10b50 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20  in doubt return 
10b60 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20  FALSE.  A false 
10b70 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68  negative.** is h
10b80 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73  armless.  A fals
10b90 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65  e positive, howe
10ba0 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20  ver, can result 
10bb0 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20  in the wrong.** 
10bc0 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  answer..*/.int s
10bd0 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
10be0 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
10bf0 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63  const Expr *p, c
10c00 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f  har aff){.  u8 o
10c10 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51  p;.  if( aff==SQ
10c20 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20  LITE_AFF_BLOB ) 
10c30 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c  return 1;.  whil
10c40 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
10c50 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
10c60 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
10c70 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
10c80 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
10c90 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
10ca0 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
10cb0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
10cc0 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
10cd0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
10ce0 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
10cf0 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
10d00 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
10d10 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
10d20 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
10d30 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
10d40 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
10d50 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  L || aff==SQLITE
10d60 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
10d70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
10d80 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
10d90 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
10da0 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
10db0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
10dc0 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LOB: {.      ret
10dd0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
10de0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
10df0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
10e00 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b   p->iTable>=0 );
10e10 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65    /* p cannot be
10e20 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b   part of a CHECK
10e30 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
10e40 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
10e50 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20  Column<0.       
10e60 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
10e70 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
10e80 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
10e90 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20  F_NUMERIC);.    
10ea0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
10eb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
10ec0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
10ed0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
10ee0 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
10ef0 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
10f00 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
10f10 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
10f20 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
10f30 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
10f40 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
10f50 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
10f60 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
10f70 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
10f80 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
10f90 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
10fa0 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
10fb0 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
10fc0 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
10fd0 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68  ../*.** pX is th
10fe0 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f  e RHS of an IN o
10ff0 70 65 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20  perator.  If pX 
11000 69 73 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  is a SELECT stat
11010 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63  ement .** that c
11020 61 6e 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64  an be simplified
11030 20 74 6f 20 61 20 64 69 72 65 63 74 20 74 61 62   to a direct tab
11040 6c 65 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20  le access, then 
11050 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
11060 74 65 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43  ter to the SELEC
11070 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66  T statement.  If
11080 20 70 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c   pX is not a SEL
11090 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  ECT statement,.*
110a0 2a 20 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45  * or if the SELE
110b0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65  CT statement nee
110c0 64 73 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73  ds to be manifes
110d0 74 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ted into a trans
110e0 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74  ient.** table, t
110f0 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  hen return NULL.
11100 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
11110 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
11120 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a  .static Select *
11130 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
11140 4f 70 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20  Opt(Expr *pX){. 
11150 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72   Select *p;.  Sr
11160 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45  cList *pSrc;.  E
11170 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
11180 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
11190 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
111a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
111b0 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
111c0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  ) ) return 0;  /
111d0 2a 20 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79  * Not a subquery
111e0 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61   */.  if( ExprHa
111f0 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
11200 5f 56 61 72 53 65 6c 65 63 74 29 20 20 29 20 72  _VarSelect)  ) r
11210 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72  eturn 0;  /* Cor
11220 72 65 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a  related subq */.
11230 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c    p = pX->x.pSel
11240 65 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  ect;.  if( p->pP
11250 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11270 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   Not a compound 
11280 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20  SELECT */.  if( 
11290 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
112a0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
112b0 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20  gregate) ){.    
112c0 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65  testcase( (p->se
112d0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
112e0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
112f0 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
11300 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
11310 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
11320 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
11330 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
11340 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
11350 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
11360 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  No DISTINCT keyw
11370 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65  ord and no aggre
11380 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
11390 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  /.  }.  assert( 
113a0 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
113b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
113c0 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  * Has no GROUP B
113d0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  Y clause */.  if
113e0 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  ( p->pLimit ) re
113f0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
11400 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c       /* Has no L
11410 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20  IMIT clause */. 
11420 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
11430 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
11440 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
11450 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  o WHERE clause *
11460 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  /.  pSrc = p->pS
11470 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
11480 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  rc!=0 );.  if( p
11490 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
114a0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
114b0 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d    /* Single term
114c0 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   in FROM clause 
114d0 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  */.  if( pSrc->a
114e0 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65  [0].pSelect ) re
114f0 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46  turn 0;     /* F
11500 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62  ROM is not a sub
11510 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f  query or view */
11520 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
11530 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73  a[0].pTab;.  ass
11540 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
11550 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
11560 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20  pSelect==0 );   
11570 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
11580 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
11590 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49   view */.  if( I
115a0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
115b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
115c0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
115d0 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
115e0 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  able */.  pEList
115f0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
11600 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
11610 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45  0 );.  /* All SE
11620 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73  LECT results mus
11630 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f  t be columns. */
11640 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
11650 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
11660 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65  ){.    Expr *pRe
11670 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s = pEList->a[i]
11680 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
11690 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  pRes->op!=TK_COL
116a0 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
116b0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
116c0 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e  ->iTable==pSrc->
116d0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20  a[0].iCursor ); 
116e0 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c   /* Not a correl
116f0 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f  ated subquery */
11700 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
11710 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
11720 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
11730 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
11740 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
11750 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
11760 65 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63  e code that chec
11770 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ks the left-most
11780 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
11790 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73   table iCur to s
117a0 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74  ee if.** it cont
117b0 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e  ains any NULL en
117c0 74 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68  tries.  Cause th
117d0 65 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65  e register at re
117e0 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73  gHasNull to be s
117f0 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e  et.** to a non-N
11800 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75  ULL value if iCu
11810 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55  r contains no NU
11820 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69  LLs.  Cause regi
11830 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a  ster regHasNull.
11840 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  ** to be set to 
11850 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e  NULL if iCur con
11860 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
11870 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  e NULL values..*
11880 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
11890 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
118a0 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lag(Vdbe *v, int
118b0 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61   iCur, int regHa
118c0 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64  sNull){.  int ad
118d0 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr1;.  sqlite3Vd
118e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
118f0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61  nteger, 0, regHa
11900 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20  sNull);.  addr1 
11910 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11920 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
11930 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76  , iCur); VdbeCov
11940 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
11950 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11960 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72   OP_Column, iCur
11970 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29  , 0, regHasNull)
11980 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
11990 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
119a0 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
119b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
119c0 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28  "first_entry_in(
119d0 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20  %d)", iCur));.  
119e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
119f0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d  ere(v, addr1);.}
11a00 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
11a10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
11a20 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65  BQUERY./*.** The
11a30 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
11a40 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
11a50 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
11a60 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20  ubquery) on the 
11a70 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73  .** right-hand s
11a80 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ide.  Return TRU
11a90 45 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69  E if that list i
11aa0 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73  s constant..*/.s
11ab0 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
11ac0 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74  3InRhsIsConstant
11ad0 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45  (Expr *pIn){.  E
11ae0 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74  xpr *pLHS;.  int
11af0 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
11b00 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
11b10 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65  (pIn, EP_xIsSele
11b20 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20  ct) );.  pLHS = 
11b30 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49  pIn->pLeft;.  pI
11b40 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  n->pLeft = 0;.  
11b50 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  res = sqlite3Exp
11b60 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29  rIsConstant(pIn)
11b70 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
11b80 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20   pLHS;.  return 
11b90 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  res;.}.#endif../
11ba0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
11bb0 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
11bc0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
11bd0 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29   of the IN (...)
11be0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68   operator..** Th
11bf0 65 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69  e pX parameter i
11c00 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
11c10 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
11c20 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
11c30 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
11c40 65 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20  e either a list 
11c50 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  of expressions o
11c60 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  r a subquery..**
11c70 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
11c80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
11c90 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  o find or create
11ca0 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74   a b-tree object
11cb0 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20   that can.** be 
11cc0 75 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74  used either to t
11cd0 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  est for membersh
11ce0 69 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65  ip in the RHS se
11cf0 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  t or to iterate 
11d00 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d  through.** all m
11d10 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48  embers of the RH
11d20 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  S set, skipping 
11d30 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a  duplicates..**.*
11d40 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70  * A cursor is op
11d50 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72  ened on the b-tr
11d60 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ee object that i
11d70 73 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  s the RHS of the
11d80 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
11d90 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69  and pX->iTable i
11da0 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
11db0 65 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f  ex of that curso
11dc0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  r..**.** The ret
11dd0 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74  urned value of t
11de0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
11df0 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65  icates the b-tre
11e00 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
11e10 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
11e20 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20  NDEX_ROWID      
11e30 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
11e40 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
11e50 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
11e60 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
11e70 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73  _ASC  - The curs
11e80 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
11e90 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
11ea0 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
11eb0 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20  EX_INDEX_DESC - 
11ec0 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
11ed0 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65  pened on a desce
11ee0 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
11ef0 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20    IN_INDEX_EPH  
11f00 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
11f10 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
11f20 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
11f30 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f50 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70      populated ep
11f60 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
11f70 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  *   IN_INDEX_NOO
11f80 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72  P       - No cur
11f90 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  sor was allocate
11fa0 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61  d.  The IN opera
11fb0 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20  tor must be.**  
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fd0 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74         implement
11fe0 65 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65  ed as a sequence
11ff0 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e   of comparisons.
12000 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
12010 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20  ng b-tree might 
12020 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52  be used if the R
12030 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58  HS expression pX
12040 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20   is a simple.** 
12050 73 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73  subquery such as
12060 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
12070 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63  CT <column1>, <c
12080 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20  olumn2>... FROM 
12090 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66  <table>.**.** If
120a0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
120b0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
120c0 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20   list or a more 
120d0 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79  complex subquery
120e0 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68  , then.** an eph
120f0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67  emeral table mig
12100 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65  ht need to be ge
12110 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
12120 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a   RHS and then.**
12130 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65   pX->iTable made
12140 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
12150 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
12160 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a   instead of an.*
12170 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  * existing table
12180 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c  ..**.** The inFl
12190 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75  ags parameter mu
121a0 73 74 20 63 6f 6e 74 61 69 6e 2c 20 61 74 20 61  st contain, at a
121b0 20 6d 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66   minimum, one of
121c0 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f   the bits.** IN_
121d0 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
121e0 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f   or IN_INDEX_LOO
121f0 50 20 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20  P but not both. 
12200 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74   If inFlags cont
12210 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  ains.** IN_INDEX
12220 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65  _MEMBERSHIP, the
12230 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  n the generated 
12240 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73  table will be us
12250 65 64 20 66 6f 72 20 61 20 66 61 73 74 0a 2a 2a  ed for a fast.**
12260 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
12270 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49  .  When the IN_I
12280 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73  NDEX_LOOP bit is
12290 20 73 65 74 2c 20 74 68 65 20 49 4e 20 69 6e 64   set, the IN ind
122a0 65 78 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75 73  ex will.** be us
122b0 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20  ed to loop over 
122c0 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68  all values of th
122d0 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
122e0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
122f0 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  When IN_INDEX_LO
12300 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  OP is used (and 
12310 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
12320 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
12330 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68  te.** through th
12340 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74  e set members) t
12350 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hen the b-tree m
12360 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  ust not contain 
12370 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41  duplicates..** A
12380 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
12390 65 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  e will be create
123a0 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c  d unless the sel
123b0 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  ected columns ar
123c0 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  e guaranteed.** 
123d0 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65  to be unique - e
123e0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74  ither because it
123f0 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
12400 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75  RIMARY KEY or du
12410 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45  e to.** a UNIQUE
12420 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69   constraint or i
12430 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ndex..**.** When
12440 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
12450 53 48 49 50 20 69 73 20 75 73 65 64 20 28 61 6e  SHIP is used (an
12460 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
12470 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f  l be used .** fo
12480 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65  r fast set membe
12490 72 73 68 69 70 20 74 65 73 74 73 29 20 74 68 65  rship tests) the
124a0 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  n an epheremal t
124b0 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65  able must .** be
124c0 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f   used unless <co
124d0 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67  lumns> is a sing
124e0 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  le INTEGER PRIMA
124f0 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72  RY KEY column or
12500 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61   an .** index ca
12510 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20  n be found with 
12520 74 68 65 20 73 70 65 63 69 66 69 65 64 20 3c 63  the specified <c
12530 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c  olumns> as its l
12540 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20  eft-most..**.** 
12550 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  If the IN_INDEX_
12560 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49  NOOP_OK and IN_I
12570 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
12580 61 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64  are both set and
12590 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f  .** if the RHS o
125a0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
125b0 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74  r is a list (not
125c0 20 61 20 73 75 62 71 75 65 72 79 29 20 74 68 65   a subquery) the
125d0 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
125e0 65 20 6d 69 67 68 74 20 64 65 63 69 64 65 20 74  e might decide t
125f0 68 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20  hat creating an 
12600 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65  ephemeral b-tree
12610 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a   for membership.
12620 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f  ** testing is to
12630 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20  o expensive and 
12640 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f  return IN_INDEX_
12650 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63  NOOP.  In that c
12660 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ase, the.** call
12670 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  ing routine shou
12680 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  ld implement the
12690 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69   IN operator usi
126a0 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ng a sequence.**
126b0 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d   of Eq or Ne com
126c0 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
126d0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ns..**.** When t
126e0 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69  he b-tree is bei
126f0 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62  ng used for memb
12700 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68  ership tests, th
12710 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
12720 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64  on.** might need
12730 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72   to know whether
12740 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20   or not the RHS 
12750 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
12760 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61  perator.** conta
12770 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20  ins a NULL.  If 
12780 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
12790 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  not a NULL point
127a0 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68  er and .** if th
127b0 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63  ere is any chanc
127c0 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
127d0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
127e0 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a   NULL value at.*
127f0 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20  * runtime, then 
12800 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
12810 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
12820 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
12830 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70  written.** to *p
12840 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20  rRhsHasNull. If 
12850 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
12860 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
12870 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  ) contains a.** 
12880 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e  NULL value, then
12890 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69   *prRhsHasNull i
128a0 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
128b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
128c0 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
128d0 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74  ed and its locat
128e0 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  ion stored in *p
128f0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65  rRhsHasNull, the
12900 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
12910 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
12920 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
12930 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
12940 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  ins one or more.
12950 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ** NULL values, 
12960 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73  and it will be s
12970 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  ome non-NULL val
12980 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ue if the b-tree
12990 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
129a0 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  NULL values..**.
129b0 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61 70 20  ** If the aiMap 
129c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
129d0 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70   NULL, it must p
129e0 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79  oint to an array
129f0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f   containing.** o
12a00 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65  ne element for e
12a10 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  ach column retur
12a20 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
12a30 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74  T statement on t
12a40 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65  he RHS.** of the
12a50 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f   IN(...) operato
12a60 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e 74 72  r. The i'th entr
12a70 79 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69  y of the array i
12a80 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
12a90 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f   the.** offset o
12aa0 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75  f the index colu
12ab0 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  mn that matches 
12ac0 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20  the i'th column 
12ad0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a  returned by the.
12ae0 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65  ** SELECT. For e
12af0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65  xample, if the e
12b00 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65  xpression and se
12b10 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61 72 65  lected index are
12b20 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f  :.**.**   (?,?,?
12b30 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20  ) IN (SELECT a, 
12b40 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a  b, c FROM t1).**
12b50 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
12b60 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61  i1 ON t1(b, c, a
12b70 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69  );.**.** then ai
12b80 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74  Map[] is populat
12b90 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31  ed with {2, 0, 1
12ba0 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  }..*/.#ifndef SQ
12bb0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
12bc0 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  RY.int sqlite3Fi
12bd0 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72  ndInIndex(.  Par
12be0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12bf0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
12c00 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
12c10 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20  Expr *pX,       
12c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12c30 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
12c40 65 20 28 52 48 53 29 20 6f 66 20 74 68 65 20 49  e (RHS) of the I
12c50 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
12c60 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20  u32 inFlags,    
12c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
12c80 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45  _INDEX_LOOP, _ME
12c90 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72  MBERSHIP, and/or
12ca0 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69   _NOOP_OK */.  i
12cb0 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  nt *prRhsHasNull
12cc0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ,         /* Reg
12cd0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55  ister holding NU
12ce0 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65 65 20  LL status.  See 
12cf0 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  notes */.  int *
12d00 61 69 4d 61 70 20 20 20 20 20 20 20 20 20 20 20  aiMap           
12d10 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
12d20 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c   from Index fiel
12d30 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73  ds to RHS fields
12d40 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
12d50 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d70 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20  * SELECT to the 
12d80 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72  right of IN oper
12d90 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54  ator */.  int eT
12da0 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74  /* Type of RHS t
12dd0 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a  able. IN_INDEX_*
12de0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
12df0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
12e10 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53  ursor of the RHS
12e20 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
12e30 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20  mustBeUnique;   
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53    /* True if RHS
12e60 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20   must be unique 
12e70 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
12e80 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12e90 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69  arse);     /* Vi
12ea0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
12eb0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20  ing coded */..  
12ec0 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
12ed0 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42  TK_IN );.  mustB
12ee0 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61  eUnique = (inFla
12ef0 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
12f00 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66  OP)!=0;..  /* If
12f10 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 69 73   the RHS of this
12f20 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f   IN(...) operato
12f30 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61  r is a SELECT, a
12f40 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65 72 73  nd if it matters
12f50 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
12f60 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54  r not the SELECT
12f70 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73   result contains
12f80 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68   NULL values, ch
12f90 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a  eck whether.  **
12fa0 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20   or not NULL is 
12fb0 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c  actually possibl
12fc0 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65  e (it may not be
12fd0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64  , for example, d
12fe0 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20  ue .  ** to NOT 
12ff0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
13000 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e   in the schema).
13010 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75   If no NULL valu
13020 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c  es are possible,
13030 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48  .  ** set prRhsH
13040 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f  asNull to 0 befo
13050 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  re continuing.  
13060 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73 48 61  */.  if( prRhsHa
13070 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c  sNull && (pX->fl
13080 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
13090 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ct) ){.    int i
130a0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
130b0 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70  pEList = pX->x.p
130c0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
130d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
130e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
130f0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
13100 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
13110 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ll(pEList->a[i].
13120 70 45 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a  pExpr) ) break;.
13130 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
13140 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  =pEList->nExpr )
13150 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48 61 73  {.      prRhsHas
13160 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Null = 0;.    }.
13170 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
13180 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69  to see if an exi
13190 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
131a0 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
131b0 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79   to.  ** satisfy
131c0 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
131d0 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20  s is preferable 
131e0 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  to generating a 
131f0 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65  new .  ** epheme
13200 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ral table.  */. 
13210 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
13220 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43  r==0 && (p = isC
13230 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
13240 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  (pX))!=0 ){.    
13250 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13260 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
13270 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
13280 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
13290 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
132a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
132b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
132c0 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f  able <table>. */
132d0 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20 20 20  .    i16 iDb;   
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
13300 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20  atabase idx for 
13310 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72  pTab */.    Expr
13320 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
13330 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e  ->pEList;.    in
13340 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74  t nExpr = pEList
13350 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73  ->nExpr;..    as
13360 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
13370 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
13380 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
13390 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
133a0 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73  Opt(p) */.    as
133b0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
133c0 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
133d0 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20  ; /* Because of 
133e0 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
133f0 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73  Opt(p) */.    as
13400 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30  sert( p->pSrc!=0
13410 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
13420 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
13430 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
13440 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54  Opt(p) */.    pT
13450 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
13460 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a  0].pTab;..    /*
13470 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e   Code an OP_Tran
13480 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54  saction and OP_T
13490 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61  ableLock for <ta
134a0 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62  ble>. */.    iDb
134b0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
134c0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
134d0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
134e0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
134f0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
13500 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
13510 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
13520 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
13530 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
13540 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  me);..    assert
13550 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  (v);  /* sqlite3
13560 47 65 74 56 64 62 65 28 29 20 68 61 73 20 61 6c  GetVdbe() has al
13570 77 61 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f  ways been previo
13580 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  usly called */. 
13590 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20     if( nExpr==1 
135a0 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  && pEList->a[0].
135b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
135c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
135d0 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72   "x IN (SELECT r
135e0 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29  owid FROM table)
135f0 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  " case */.      
13600 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
13610 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
13620 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20   OP_Once);.     
13630 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13640 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
13650 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
13660 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
13670 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
13680 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
13690 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a  N_INDEX_ROWID;..
136a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
136b0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
136c0 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
136d0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
136e0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
136f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
13700 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
13710 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
13720 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20  inity_ok = 1;.  
13730 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
13740 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
13750 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  the affinity tha
13760 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
13770 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20 0a  o perform each .
13780 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69        ** compari
13790 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20  son is the same 
137a0 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  as the affinity 
137b0 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69  of each column i
137c0 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  n table.      **
137d0 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
137e0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  he IN operator. 
137f0 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20 69   If it not, it i
13800 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13810 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 61  o.      ** use a
13820 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ny index of the 
13830 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  RHS table.  */. 
13840 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13850 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69 74  nExpr && affinit
13860 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  y_ok; i++){.    
13870 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d      Expr *pLhs =
13880 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
13890 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70  eldSubexpr(pX->p
138a0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
138b0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c    int iCol = pEL
138c0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d  ist->a[i].pExpr-
138d0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
138e0 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d 20    char idxaff = 
138f0 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75  sqlite3TableColu
13900 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62 2c  mnAffinity(pTab,
13910 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61  iCol); /* RHS ta
13920 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ble */.        c
13930 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71 6c  har cmpaff = sql
13940 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
13950 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66 66  ity(pLhs, idxaff
13960 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
13970 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c  ase( cmpaff==SQL
13980 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a  ITE_AFF_BLOB );.
13990 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
139a0 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45  ( cmpaff==SQLITE
139b0 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
139c0 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d 70       switch( cmp
139d0 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  aff ){.         
139e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
139f0 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20  _BLOB:.         
13a00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13a10 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
13a20 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
13a30 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
13a40 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
13a50 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 54  ) only returns T
13a60 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65 20  EXT if one side 
13a70 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  or the.         
13a80 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73 20     ** other has 
13a90 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20  no affinity and 
13aa0 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20 69  the other side i
13ab0 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a  s TEXT.  Hence,.
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
13ad0 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20  he only way for 
13ae0 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45 58  cmpaff to be TEX
13af0 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66 20  T is for idxaff 
13b00 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20 20  to be TEXT.     
13b10 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f         ** and fo
13b20 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74 68  r the term on th
13b30 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
13b40 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69 6e  to have no affin
13b50 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ity. */.        
13b60 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 61      assert( idxa
13b70 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
13b80 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20  EXT );.         
13b90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13ba0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
13bb0 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
13bc0 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73  y_ok = sqlite3Is
13bd0 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
13be0 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20  idxaff);.       
13bf0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
13c00 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f    if( affinity_o
13c10 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
13c20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
13c30 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  isting index tha
13c40 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20  t will work for 
13c50 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72  this IN operator
13c60 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
13c70 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
13c80 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65  x; pIdx && eType
13c90 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  ==0; pIdx=pIdx->
13ca0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
13cb0 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65    Bitmask colUse
13cc0 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  d;      /* Colum
13cd0 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ns of the index 
13ce0 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  used */.        
13cf0 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20    Bitmask mCol; 
13d00 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
13d10 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
13d20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20  column */.      
13d30 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
13d40 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f  olumn<nExpr ) co
13d50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
13d60 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f    /* Maximum nCo
13d70 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e  lumn is BMS-2, n
13d80 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61  ot BMS-1, so tha
13d90 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65  t we can compute
13da0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49  .          ** BI
13db0 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74  TMASK(nExpr) wit
13dc0 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67  hout overflowing
13dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
13de0 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43  stcase( pIdx->nC
13df0 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a  olumn==BMS-2 );.
13e00 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
13e10 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  se( pIdx->nColum
13e20 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  n==BMS-1 );.    
13e30 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
13e40 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29  nColumn>=BMS-1 )
13e50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13e60 20 20 20 20 20 69 66 28 20 6d 75 73 74 42 65 55       if( mustBeU
13e70 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20  nique ){.       
13e80 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
13e90 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20  KeyCol>nExpr.   
13ea0 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64            ||(pId
13eb0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72  x->nColumn>nExpr
13ec0 20 26 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64   && !IsUniqueInd
13ed0 65 78 28 70 49 64 78 29 29 0a 20 20 20 20 20 20  ex(pIdx)).      
13ee0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13ef0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
13f00 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
13f10 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76  is not unique ov
13f20 65 72 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f  er the IN RHS co
13f30 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  lumns */.       
13f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13f50 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20   }.  .          
13f60 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f  colUsed = 0;   /
13f70 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64  * Columns of ind
13f80 65 78 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a  ex used so far *
13f90 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
13fa0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
13fb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
13fc0 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c  Expr *pLhs = sql
13fd0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
13fe0 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74  ubexpr(pX->pLeft
13ff0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
14000 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70    Expr *pRhs = p
14010 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
14020 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  r;.            C
14030 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73  ollSeq *pReq = s
14040 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
14050 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
14060 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a  e, pLhs, pRhs);.
14070 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
14080 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  j;.  .          
14090 20 20 61 73 73 65 72 74 28 20 70 52 65 71 21 3d    assert( pReq!=
140a0 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75  0 || pRhs->iColu
140b0 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20  mn==XN_ROWID || 
140c0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
140d0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
140e0 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b  j=0; j<nExpr; j+
140f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
14100 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
14110 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69  lumn[j]!=pRhs->i
14120 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
14130 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
14140 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
14150 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20  zColl[j] );.    
14160 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
14170 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  eq!=0 && sqlite3
14180 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e  StrICmp(pReq->zN
14190 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ame, pIdx->azCol
141a0 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20  l[j])!=0 ){.    
141b0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
141c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
141d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
141e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
141f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14200 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70       if( j==nExp
14210 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
14220 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41         mCol = MA
14230 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20  SKBIT(j);.      
14240 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26        if( mCol &
14250 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b   colUsed ) break
14260 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e  ; /* Each column
14270 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20   used only once 
14280 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  */.            c
14290 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a  olUsed |= mCol;.
142a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
142b0 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d  aiMap ) aiMap[i]
142c0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
142d0 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 61  }.  .          a
142e0 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20  ssert( i==nExpr 
142f0 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53  || colUsed!=(MAS
14300 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29  KBIT(nExpr)-1) )
14310 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14320 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49  colUsed==(MASKBI
14330 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20  T(nExpr)-1) ){. 
14340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
14350 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
14360 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
14370 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 20   the index pIdx 
14380 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20  is usable */.   
14390 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64           int iAd
143a0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
143b0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
143c0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
143d0 28 76 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (v);.#ifndef SQL
143e0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
143f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
14400 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
14410 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30 2c  , OP_Explain, 0,
14420 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
14430 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
14440 6e 74 66 28 64 62 2c 20 22 55 53 49 4e 47 20 49  ntf(db, "USING I
14450 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f  NDEX %s FOR IN-O
14460 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a  PERATOR",pIdx->z
14470 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
14480 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29       P4_DYNAMIC)
14490 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
144a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
144b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
144c0 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64  nRead, iTab, pId
144d0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
144e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
144f0 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
14500 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
14510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
14520 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
14530 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
14540 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
14550 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f  ssert( IN_INDEX_
14560 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e  INDEX_DESC == IN
14570 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
14580 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
14590 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
145a0 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70  EX_INDEX_ASC + p
145b0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
145c0 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  0];.  .         
145d0 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e     if( prRhsHasN
145e0 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ull ){.#ifdef SQ
145f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
14600 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20  MN_USED_MASK.   
14610 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d             i64 m
14620 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29  ask = (1<<nExpr)
14630 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
14640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14650 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
14660 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20  lumnsUsed, .    
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54                iT
14680 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26  ab, 0, 0, (u8*)&
14690 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b  mask, P4_INT64);
146a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
146b0 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e        *prRhsHasN
146c0 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
146d0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
146e0 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31      if( nExpr==1
146f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14700 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
14710 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61  sNullFlag(v, iTa
14720 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  b, *prRhsHasNull
14730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
14740 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
14750 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
14760 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14770 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
14780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14790 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76  } /* End loop ov
147a0 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  er indexes */.  
147b0 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28      } /* End if(
147c0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a   affinity_ok ) *
147d0 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69  /.    } /* End i
147e0 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69  f not an rowid i
147f0 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45  ndex */.  } /* E
14800 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70  nd attempt to op
14810 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20  timize using an 
14820 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49  index */..  /* I
14830 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67  f no preexisting
14840 20 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61   index is availa
14850 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63  ble for the IN c
14860 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49  lause.  ** and I
14870 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
14880 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79  an allowed reply
14890 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
148a0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
148b0 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20  ator is a list, 
148c0 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20  not a subquery. 
148d0 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
148e0 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
148f0 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65  or has two or fe
14900 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20  wer terms,.  ** 
14910 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77  then it is not w
14920 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e  orth creating an
14930 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
14940 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a   to evaluate.  *
14950 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  * the IN operato
14960 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49  r so return IN_I
14970 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a  NDEX_NOOP..  */.
14980 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20    if( eType==0. 
14990 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20    && (inFlags & 
149a0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
149b0 29 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73  ).   && !ExprHas
149c0 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
149d0 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26  xIsSelect).   &&
149e0 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49   (!sqlite3InRhsI
149f0 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c  sConstant(pX) ||
14a00 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pX->x.pList->nE
14a10 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20  xpr<=2).  ){.   
14a20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
14a30 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  X_NOOP;.  }..  i
14a40 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( eType==0 ){. 
14a50 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20     /* Could not 
14a60 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67  find an existing
14a70 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
14a80 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48  to use as the RH
14a90 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a  S b-tree..    **
14aa0 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f   We will have to
14ab0 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68   generate an eph
14ac0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
14ad0 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20  do the job..    
14ae0 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64  */.    u32 saved
14af0 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
14b00 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
14b10 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76  .    int rMayHav
14b20 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65  eNull = 0;.    e
14b30 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
14b40 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46  EPH;.    if( inF
14b50 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
14b60 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50  LOOP ){.      pP
14b70 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
14b80 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
14b90 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  pX->pLeft->iColu
14ba0 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73  mn<0 && !ExprHas
14bb0 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
14bc0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
14bd0 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
14be0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20  _INDEX_ROWID;.  
14bf0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
14c00 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
14c10 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73   ){.      *prRhs
14c20 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61  HasNull = rMayHa
14c30 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  veNull = ++pPars
14c40 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20  e->nMem;.    }. 
14c50 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
14c60 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
14c70 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  pX, rMayHaveNull
14c80 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  , eType==IN_INDE
14c90 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50  X_ROWID);.    pP
14ca0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
14cb0 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f   = savedNQueryLo
14cc0 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  op;.  }else{.   
14cd0 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pX->iTable = iT
14ce0 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61  ab;.  }..  if( a
14cf0 69 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d 49  iMap && eType!=I
14d00 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
14d10 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49  C && eType!=IN_I
14d20 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
14d30 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b  ){.    int i, n;
14d40 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
14d50 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
14d60 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66  X->pLeft);.    f
14d70 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
14d80 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a  ) aiMap[i] = i;.
14d90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79    }.  return eTy
14da0 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  pe;.}.#endif..#i
14db0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14dc0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
14dd0 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20   Argument pExpr 
14de0 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20  is an (?, ?...) 
14df0 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
14e00 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  on. This .** fun
14e10 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
14e20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75  and returns a nu
14e30 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
14e40 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a  ing containing .
14e50 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  ** the affinitie
14e60 73 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  s to be used for
14e70 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   each column of 
14e80 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a  the comparison..
14e90 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  **.** It is the 
14ea0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
14eb0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
14ec0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
14ed0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69  returned.** stri
14ee0 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  ng is eventually
14ef0 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c   freed using sql
14f00 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f  ite3DbFree()..*/
14f10 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78  .static char *ex
14f20 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72  prINAffinity(Par
14f30 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
14f40 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72   *pExpr){.  Expr
14f50 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
14f60 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56  >pLeft;.  int nV
14f70 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
14f80 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
14f90 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  );.  Select *pSe
14fa0 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66  lect = (pExpr->f
14fb0 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
14fc0 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e  ect) ? pExpr->x.
14fd0 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63  pSelect : 0;.  c
14fe0 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73  har *zRet;..  as
14ff0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
15000 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74  =TK_IN );.  zRet
15010 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
15020 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62  ocRaw(pParse->db
15030 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28  , nVal+1);.  if(
15040 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   zRet ){.    int
15050 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
15060 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
15070 20 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20       Expr *pA = 
15080 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
15090 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
150a0 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20   i);.      char 
150b0 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  a = sqlite3ExprA
150c0 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20  ffinity(pA);.   
150d0 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
150e0 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69  {.        zRet[i
150f0 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  ] = sqlite3Compa
15100 72 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65  reAffinity(pSele
15110 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
15120 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20  .pExpr, a);.    
15130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15140 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20   zRet[i] = a;.  
15150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15160 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30  zRet[nVal] = '\0
15170 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ';.  }.  return 
15180 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
15190 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
151a0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
151b0 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73  ** Load the Pars
151c0 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
151d0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
151e0 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72  ument with an er
151f0 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20  ror .** message 
15200 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
15210 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74  **   "sub-select
15220 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d   returns N colum
15230 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22  ns - expected M"
15240 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69  .*/   .void sqli
15250 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
15260 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
15270 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e   int nActual, in
15280 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f  t nExpect){.  co
15290 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d  nst char *zFmt =
152a0 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74   "sub-select ret
152b0 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20  urns %d columns 
152c0 2d 20 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a  - expected %d";.
152d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
152e0 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20  g(pParse, zFmt, 
152f0 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74  nActual, nExpect
15300 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
15310 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45  ** Expression pE
15320 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 20  xpr is a vector 
15330 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 75 73  that has been us
15340 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20  ed in a context 
15350 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e  where.** it is n
15360 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66  ot permitted. If
15370 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d   pExpr is a sub-
15380 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74  select vector, t
15390 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20  his routine .** 
153a0 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73 65 20  loads the Parse 
153b0 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65  object with a me
153c0 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72  ssage of the for
153d0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d  m:.**.**   "sub-
153e0 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e  select returns N
153f0 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
15400 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ted 1".**.** Or,
15410 20 69 66 20 69 74 20 69 73 20 61 20 72 65 67 75   if it is a regu
15420 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f  lar scalar vecto
15430 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20  r:.**.**   "row 
15440 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a  value misused".*
15450 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
15460 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
15470 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
15480 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66  xpr *pExpr){.#if
15490 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
154a0 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
154b0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
154c0 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20  P_xIsSelect ){. 
154d0 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
154e0 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
154f0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
15500 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
15510 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  , 1);.  }else.#e
15520 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
15530 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15540 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
15550 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d  misused");.  }.}
15560 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
15570 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72   code for scalar
15580 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64   subqueries used
15590 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65   as a subquery e
155a0 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54  xpression, EXIST
155b0 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72  S,.** or IN oper
155c0 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73  ators.  Examples
155d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
155e0 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
155f0 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
15600 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
15610 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
15620 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
15630 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78  ubquery.**     x
15640 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20   IN (4,5,11)    
15650 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20            -- IN 
15660 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69  operator with li
15670 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  st on right-hand
15680 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49   side.**     x I
15690 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  N (SELECT a FROM
156a0 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70   b)     -- IN op
156b0 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71  erator with subq
156c0 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68  uery on the righ
156d0 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70  t.**.** The pExp
156e0 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63  r parameter desc
156f0 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73  ribes the expres
15700 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
15710 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65  ns the IN.** ope
15720 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72  rator or subquer
15730 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
15740 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73  meter isRowid is
15750 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
15760 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
15770 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
15780 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66  * to be of the f
15790 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20  orm "<rowid> IN 
157a0 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72  (?, ?, ?)", wher
157b0 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72  e <rowid> is a r
157c0 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73  eference.** to s
157d0 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  ome integer key 
157e0 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
157f0 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69  e B-Tree. In thi
15800 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a  s case, use an.*
15810 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20  * intkey B-Tree 
15820 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
15830 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75   of IN(...) valu
15840 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  es instead of th
15850 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77  e usual.** (slow
15860 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  er) variable len
15870 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e  gth keys B-Tree.
15880 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61  .**.** If rMayHa
15890 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65  veNull is non-ze
158a0 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ro, that means t
158b0 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  hat the operatio
158c0 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e  n is an IN.** (n
158d0 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  ot a SELECT or E
158e0 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20  XISTS) and that 
158f0 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f  the RHS might co
15900 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a  ntains NULLs..**
15910 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
15920 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61  e does is initia
15930 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65  lize the registe
15940 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48  r given by rMayH
15950 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55  aveNull.** to NU
15960 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75  LL.  Calling rou
15970 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20  tines will take 
15980 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67  care of changing
15990 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a   this register.*
159a0 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e  * value to non-N
159b0 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69  ULL if the RHS i
159c0 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a  s NULL-free..**.
159d0 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20  ** For a SELECT 
159e0 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
159f0 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72  or, return the r
15a00 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c  egister that hol
15a10 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  ds the.** result
15a20 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63  .  For a multi-c
15a30 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68  olumn SELECT, th
15a40 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
15a50 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f  ed in a contiguo
15a60 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72  us.** array of r
15a70 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
15a80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
15a90 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66   the register of
15aa0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
15ab0 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e  * result column.
15ac0 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49    Return 0 for I
15ad0 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69  N operators or i
15ae0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
15af0 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  s..*/.#ifndef SQ
15b00 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15b10 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  RY.int sqlite3Co
15b20 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50  deSubselect(.  P
15b30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15b40 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15b50 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
15b60 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
15b70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
15b80 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49  , SELECT, or EXI
15b90 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  STS operator */.
15ba0 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c    int rHasNullFl
15bb0 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ag,       /* Reg
15bc0 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72  ister that recor
15bd0 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73  ds whether NULLs
15be0 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f   exist in RHS */
15bf0 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20  .  int isRowid  
15c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
15c10 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e   true, LHS of IN
15c20 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72   operator is a r
15c30 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  owid */.){.  int
15c40 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
15c50 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
15c60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d           /* One-
15c70 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73  time test addres
15c80 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20  s */.  int rReg 
15c90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15cb0 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69  * Register stori
15cc0 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a  ng resulting */.
15cd0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
15ce0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
15cf0 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  e);.  if( NEVER(
15d00 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  v==0) ) return 0
15d10 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
15d20 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
15d30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c  ;..  /* The eval
15d40 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  uation of the IN
15d50 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d  /EXISTS/SELECT m
15d60 75 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20  ust be repeated 
15d70 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20  every time it.  
15d80 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
15d90 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  d if any of the 
15da0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
15db0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
15dc0 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
15dd0 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72  d side is a corr
15de0 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a  elated subquery.
15df0 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
15e00 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
15e10 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
15e20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
15e30 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20  variables.  **  
15e40 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69    *  We are insi
15e50 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a  de a trigger.  *
15e60 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  *.  ** If all of
15e70 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66   the above are f
15e80 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61  alse, then we ca
15e90 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  n run this code 
15ea0 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73  just once.  ** s
15eb0 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c  ave the results,
15ec0 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73   and reuse the s
15ed0 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75  ame result on su
15ee0 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
15ef0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
15f00 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
15f10 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
15f20 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d  elect) ){.    jm
15f30 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c  pIfDynamic = sql
15f40 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
15f50 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
15f60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
15f70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15f80 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
15f90 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
15fa0 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68  ain==2 ){.    ch
15fb0 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
15fc0 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
15fd0 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20 25  ->db, "EXECUTE %
15fe0 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  s%s SUBQUERY %d"
15ff0 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44  ,.        jmpIfD
16000 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f  ynamic>=0?"":"CO
16010 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20  RRELATED ",.    
16020 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
16030 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41  K_IN?"LIST":"SCA
16040 4c 41 52 22 2c 0a 20 20 20 20 20 20 20 20 70 50  LAR",.        pP
16050 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
16060 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tId.    );.    s
16070 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16080 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
16090 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
160a0 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
160b0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
160c0 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68  #endif..  switch
160d0 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
160e0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
160f0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
16120 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
16130 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
16140 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
16150 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
16160 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66  t; /* the LHS of
16170 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
16180 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   */.      KeyInf
16190 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
161a0 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66        /* Key inf
161b0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
161c0 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20    int nVal;     
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161e0 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20   Size of vector 
161f0 70 4c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a  pLeft */.      .
16200 20 20 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c        nVal = sql
16210 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
16220 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  ze(pLeft);.     
16230 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69   assert( !isRowi
16240 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a  d || nVal==1 );.
16250 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
16260 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20  r this is an 'x 
16270 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f  IN(SELECT...)' o
16280 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72  r an 'x IN(<expr
16290 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a  list>)'.      **
162a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69   expression it i
162b0 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61  s handled the sa
162c0 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65  me way.  An ephe
162d0 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a  meral table is .
162e0 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
162f0 77 69 74 68 20 69 6e 64 65 78 20 6b 65 79 73 20  with index keys 
16300 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
16310 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
16320 65 20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  e .      ** SELE
16330 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
16340 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
16350 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
16360 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
16370 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
16380 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
16390 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
163a0 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
163b0 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
163c0 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
163d0 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
163e0 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
163f0 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
16400 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
16410 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
16420 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
16430 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
16440 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
16450 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
16460 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
16470 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
16480 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
16490 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
164a0 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
164b0 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
164c0 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
164d0 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
164e0 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
164f0 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
16500 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
16510 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
16520 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
16530 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
16540 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
16550 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
16560 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20  Ephemeral, .    
16570 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
16580 62 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a  ble, (isRowid?0:
16590 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b  nVal));.      pK
165a0 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64  eyInfo = isRowid
165b0 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65   ? 0 : sqlite3Ke
165c0 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
165d0 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b  e->db, nVal, 1);
165e0 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ..      if( Expr
165f0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
16600 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
16610 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
16620 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
16630 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
16640 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
16650 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
16660 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
16670 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
16680 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
16690 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
166a0 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
166b0 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
166c0 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
166d0 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
166e0 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70   *pSelect = pExp
166f0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
16700 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
16710 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
16720 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20  ->pEList;..     
16730 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f     assert( !isRo
16740 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  wid );.        /
16750 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64  * If the LHS and
16760 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
16770 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d  perator do not m
16780 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20 20 20  atch, that.     
16790 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c     ** error will
167a0 20 68 61 76 65 20 62 65 65 6e 20 63 61 75 67 68   have been caugh
167b0 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65  t long before we
167c0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
167d0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  t. */.        if
167e0 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74 2d  ( ALWAYS(pEList-
167f0 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b  >nExpr==nVal) ){
16800 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
16810 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
16820 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
16830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
16840 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
16850 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78  st, SRT_Set, pEx
16860 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
16870 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66         dest.zAff
16880 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66  Sdst = exprINAff
16890 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45  inity(pParse, pE
168a0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
168b0 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
168c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 0;.          t
168d0 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74  estcase( pSelect
168e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
168f0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
16900 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16910 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f  pKeyInfo==0 ); /
16920 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20  * Caused by OOM 
16930 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  in sqlite3KeyInf
16940 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20  oAlloc() */.    
16950 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
16960 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
16970 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
16980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
16990 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
169a0 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
169b0 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
169c0 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
169d0 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
169e0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
169f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
16a00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16a10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
16a20 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
16a30 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
16a40 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
16a50 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
16a60 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
16a70 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
16a80 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
16a90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
16aa0 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
16ab0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
16ac0 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
16ad0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16ae0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
16af0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
16b00 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
16b10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
16b20 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
16b30 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73       Expr *p = s
16b40 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
16b50 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
16b60 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
16b70 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
16b80 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  i] = sqlite3Bina
16b90 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
16ba0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
16bb0 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c    pParse, p, pEL
16bc0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a  ist->a[i].pExpr.
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
16be0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16bf0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16c00 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
16c10 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29  r->x.pList!=0) )
16c20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
16c30 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
16c40 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
16c50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
16c60 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
16c70 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
16c80 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
16c90 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
16ca0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
16cb0 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
16cc0 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
16cd0 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
16ce0 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
16cf0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
16d00 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
16d10 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
16d20 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
16d30 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
16d40 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
16d50 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
16d60 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
16d70 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
16d80 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
16d90 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66    /* Affinity of
16da0 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
16db0 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  IN */.        in
16dc0 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
16dd0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
16de0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
16df0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
16e00 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
16e10 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  em;.        int 
16e20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20  r1, r2, r3;..   
16e30 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
16e40 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
16e50 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ity(pLeft);.    
16e60 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
16e70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
16e80 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
16e90 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20  _AFF_BLOB;.     
16ea0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
16eb0 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
16ec0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
16ed0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
16ee0 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
16ef0 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o) );.          
16f00 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
16f10 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  0] = sqlite3Expr
16f20 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
16f30 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
16f40 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
16f50 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
16f60 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
16f70 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
16f80 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d   */.        r1 =
16f90 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16fa0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
16fb0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
16fc0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
16fd0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
16fe0 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65  isRowid ) sqlite
16ff0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
17000 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 32 2c 20 30  P_Blob, 0, r2, 0
17010 2c 20 22 22 2c 20 50 34 5f 53 54 41 54 49 43 29  , "", P4_STATIC)
17020 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
17030 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
17040 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
17050 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
17060 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
17070 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
17080 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
17090 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a  int iValToIns;..
170a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
170b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
170c0 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
170d0 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
170e0 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
170f0 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
17100 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
17110 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
17120 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
17130 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
17140 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
17150 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
17160 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
17170 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
17180 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
17190 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
171a0 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
171b0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
171c0 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66         if( jmpIf
171d0 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73  Dynamic>=0 && !s
171e0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
171f0 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
17200 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17210 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
17220 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  (v, jmpIfDynamic
17230 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
17240 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
17250 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
17260 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
17270 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
17280 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
17290 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
172a0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
172b0 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26     if( isRowid &
172c0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
172d0 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61  nteger(pE2, &iVa
172e0 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20  lToIns) ){.     
172f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17300 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
17310 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d  nsertInt, pExpr-
17320 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61  >iTable, r2, iVa
17330 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20  lToIns);.       
17340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17350 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
17360 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
17370 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31  (pParse, pE2, r1
17380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
17390 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20  f( isRowid ){.  
173a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
173b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
173c0 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
173d0 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
17400 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
17410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  .              V
17420 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
17440 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17450 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45  v, OP_Insert, pE
17460 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
17470 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r3);.          
17480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
174a0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
174b0 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
174c0 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
174d0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
174e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
174f0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
17500 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
17510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17520 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17530 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
17540 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
17550 62 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31 29 3b  ble, r2, r3, 1);
17560 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
17570 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17580 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
17590 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
175a0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
175b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
175c0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
175d0 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
175e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65   }.      if( pKe
175f0 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
17600 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
17610 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76  geP4(v, addr, (v
17620 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  oid *)pKeyInfo, 
17630 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
17640 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
17650 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
17660 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
17670 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
17680 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
17690 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a        /* Case 3:
176a0 20 20 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20      (SELECT ... 
176b0 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20  FROM ...).      
176c0 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20 20 45 58  **     or:    EX
176d0 49 53 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ISTS(SELECT ... 
176e0 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20  FROM ...).      
176f0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
17700 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61  a SELECT, genera
17710 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
17720 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c  he values for al
17730 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20  l columns of.   
17740 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
17750 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  row into an arra
17760 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61  y of registers a
17770 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e  nd return the in
17780 64 65 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  dex of.      ** 
17790 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
177a0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
177b0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
177c0 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74   an EXISTS, writ
177d0 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28  e an integer 0 (
177e0 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31  not exists) or 1
177f0 20 28 65 78 69 73 74 73 29 0a 20 20 20 20 20 20   (exists).      
17800 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
17810 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  er and return th
17820 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  at register numb
17830 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
17840 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61     ** In both ca
17850 73 65 73 2c 20 74 68 65 20 71 75 65 72 79 20 69  ses, the query i
17860 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
17870 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79   "LIMIT 1".  Any
17880 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 65 78   .      ** preex
17890 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20  isting limit is 
178a0 64 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61  discarded in pla
178b0 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49  ce of the new LI
178c0 4d 49 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f 0a  MIT 1..      */.
178d0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
178e0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
178f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17900 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
17910 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20  to encode */.   
17920 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
17930 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
17940 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
17950 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c  to deal with SEL
17960 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ECT result */.  
17970 20 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20      int nReg;   
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
179a0 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
179b0 74 65 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  te */.      Expr
179c0 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20   *pLimit;       
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 20 2f 2a 20 4e 65 77 20 6c 69 6d 69 74 20 65    /* New limit e
179f0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20  xpression */..  
17a00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
17a10 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
17a20 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
17a30 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
17a40 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
17a50 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
17a60 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
17a70 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
17a80 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
17a90 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
17aa0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17ab0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
17ac0 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  ;..      pSel = 
17ad0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
17ae0 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70  ;.      nReg = p
17af0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
17b00 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69  ECT ? pSel->pELi
17b10 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20  st->nExpr : 1;. 
17b20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
17b30 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
17b40 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 0, pParse->nMe
17b50 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  m+1);.      pPar
17b60 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
17b70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
17b80 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
17b90 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74   ){.        dest
17ba0 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
17bb0 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69  ;.        dest.i
17bc0 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
17bd0 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73  arm;.        des
17be0 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a  t.nSdst = nReg;.
17bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17c00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
17c10 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53  Null, 0, dest.iS
17c20 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50  DParm, dest.iSDP
17c30 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20  arm+nReg-1);.   
17c40 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
17c50 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
17c60 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
17c70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17c80 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
17c90 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
17ca0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17cb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
17cc0 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53  eger, 0, dest.iS
17cd0 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  DParm);.        
17ce0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
17cf0 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
17d00 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
17d10 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 73        pLimit = s
17d20 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
17d30 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49  pParse->db, TK_I
17d40 4e 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49  NTEGER,&sqlite3I
17d50 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b  ntTokens[1], 0);
17d60 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d  .      if( pSel-
17d70 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
17d80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
17d90 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
17da0 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70   pSel->pLimit->p
17db0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Left);.        p
17dc0 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65  Sel->pLimit->pLe
17dd0 66 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  ft = pLimit;.   
17de0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17df0 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
17e00 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
17e10 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c 20  arse, TK_LIMIT, 
17e20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20  pLimit, 0);.    
17e30 20 20 7d 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e    }.      pSel->
17e40 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
17e50 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73    pSel->selFlags
17e60 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c   &= ~SF_MultiVal
17e70 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ue;.      if( sq
17e80 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
17e90 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
17ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
17eb0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
17ec0 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e      rReg = dest.
17ed0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45  iSDParm;.      E
17ee0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
17ef0 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
17f00 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65  duce);.      bre
17f10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
17f20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61   if( rHasNullFla
17f30 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
17f40 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
17f50 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17f60 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a   rHasNullFlag);.
17f70 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66    }..  if( jmpIf
17f80 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20  Dynamic>=0 ){.  
17f90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
17fa0 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79  pHere(v, jmpIfDy
17fb0 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71  namic);.  }.  sq
17fc0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
17fd0 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65  p(pParse);..  re
17fe0 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
17ff0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
18000 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
18010 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18020 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
18030 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61  ** Expr pIn is a
18040 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73  n IN(...) expres
18050 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  sion. This funct
18060 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20  ion checks that 
18070 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65  the .** sub-sele
18080 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ct on the RHS of
18090 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74   the IN() operat
180a0 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  or has the same 
180b0 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f  number of .** co
180c0 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63  lumns as the vec
180d0 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
180e0 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f  Or, if the RHS o
180f0 66 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f  f the IN() is no
18100 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72  t .** a sub-quer
18110 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20  y, that the LHS 
18120 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73  is a vector of s
18130 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ize 1..*/.int sq
18140 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e  lite3ExprCheckIN
18150 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18160 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e  Expr *pIn){.  in
18170 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69  t nVector = sqli
18180 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
18190 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20  e(pIn->pLeft);. 
181a0 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73   if( (pIn->flags
181b0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
181c0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63   ){.    if( nVec
181d0 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c  tor!=pIn->x.pSel
181e0 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
181f0 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  pr ){.      sqli
18200 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
18210 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78  r(pParse, pIn->x
18220 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
18230 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72  ->nExpr, nVector
18240 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18250 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
18260 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20   if( nVector!=1 
18270 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65  ){.    sqlite3Ve
18280 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61  ctorErrorMsg(pPa
18290 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29  rse, pIn->pLeft)
182a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
182b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
182c0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
182d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
182e0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
182f0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
18300 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
18310 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
18320 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
18330 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
18340 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
18350 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
18360 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
18370 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63   a scalar or vec
18380 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  tor expression. 
18390 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   The .** right-h
183a0 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 69  and side (RHS) i
183b0 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65  s an array of ze
183c0 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61  ro or more scala
183d0 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a  r values, or a.*
183e0 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49 66 20  * subquery.  If 
183f0 74 68 65 20 52 48 53 20 69 73 20 61 20 73 75 62  the RHS is a sub
18400 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65  query, the numbe
18410 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
18420 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63  mns must.** matc
18430 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
18440 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76  columns in the v
18450 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ector on the LHS
18460 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
18470 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61  .** a list of va
18480 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75  lues, the LHS mu
18490 73 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20  st be a scalar. 
184a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70  .**.** The IN op
184b0 65 72 61 74 6f 72 20 69 73 20 74 72 75 65 20 69  erator is true i
184c0 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20  f the LHS value 
184d0 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  is contained wit
184e0 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20  hin the RHS..** 
184f0 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61  The result is fa
18500 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
18510 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74  s definitely not
18520 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68   in the RHS.  Th
18530 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  e .** result is 
18540 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73  NULL if the pres
18550 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20  ence of the LHS 
18560 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f  in the RHS canno
18570 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69  t be .** determi
18580 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  ned due to NULLs
18590 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
185a0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
185b0 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74  ode that jumps t
185c0 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66  o destIfFalse if
185d0 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
185e0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
185f0 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49  thin the RHS.  I
18600 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77  f due to NULLs w
18610 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
18620 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a  ne if the LHS.**
18630 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
18640 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75   the RHS then ju
18650 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c  mp to destIfNull
18660 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  .  If the LHS is
18670 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69   contained.** wi
18680 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  thin the RHS the
18690 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  n fall through..
186a0 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65  **.** See the se
186b0 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74  parate in-operat
186c0 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74  or.md documentat
186d0 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ion file in the 
186e0 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c  canonical.** SQL
186f0 69 74 65 20 73 6f 75 72 63 65 20 74 72 65 65 20  ite source tree 
18700 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
18710 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
18720 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
18730 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
18740 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18750 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18760 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
18770 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
18780 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
18790 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
187a0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
187b0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
187c0 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
187d0 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
187e0 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
187f0 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
18800 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
18810 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
18820 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
18830 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
18840 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
18850 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
18860 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
18870 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
18880 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
18890 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
188a0 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
188b0 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
188c0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
188d0 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20  t rLhs;         
188e0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28      /* Register(
188f0 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c  s) holding the L
18900 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  HS values */.  i
18910 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20  nt rLhsOrig;    
18920 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75       /* LHS valu
18930 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72  es prior to reor
18940 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b  dering by aiMap[
18950 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ] */.  Vdbe *v; 
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18970 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
18980 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
18990 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30    int *aiMap = 0
189a0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66  ;       /* Map f
189b0 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64  rom vector field
189c0 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   to index column
189d0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
189e0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41   = 0;       /* A
189f0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66  ffinity string f
18a00 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a  or comparisons *
18a10 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b  /.  int nVector;
18a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
18a30 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72  e of vectors for
18a40 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
18a50 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d  r */.  int iDumm
18a60 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
18a70 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20  Dummy parameter 
18a80 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  to exprCodeVecto
18a90 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  r() */.  Expr *p
18aa0 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Left;          /
18ab0 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * The LHS of the
18ac0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
18ad0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
18ae0 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20          /* loop 
18af0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
18b00 20 64 65 73 74 53 74 65 70 32 3b 20 20 20 20 20   destStep2;     
18b10 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
18b20 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73  ump when NULLs s
18b30 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f  een in step 2 */
18b40 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 36  .  int destStep6
18b50 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72   = 0;    /* Star
18b60 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74  t of code for St
18b70 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ep 6 */.  int ad
18b80 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20  drTruthOp;      
18b90 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70  /* Address of op
18ba0 63 6f 64 65 20 74 68 61 74 20 64 65 74 65 72 6d  code that determ
18bb0 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20 74  ines the IN is t
18bc0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  rue */.  int des
18bd0 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f  tNotNull;      /
18be0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61  * Jump here if a
18bf0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
18c00 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65 70 20  ot true in step 
18c10 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  6 */.  int addrT
18c20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
18c30 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d  Top of the step-
18c40 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c  6 loop */ ..  pL
18c50 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
18c60 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ft;.  if( sqlite
18c70 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61  3ExprCheckIN(pPa
18c80 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65  rse, pExpr) ) re
18c90 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65  turn;.  zAff = e
18ca0 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
18cb0 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
18cc0 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
18cd0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
18ce0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
18cf0 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73   aiMap = (int*)s
18d00 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
18d10 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  ro(.      pParse
18d20 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73  ->db, nVector*(s
18d30 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a  izeof(int) + siz
18d40 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20  eof(char)) + 1. 
18d50 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
18d60 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
18d70 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65  ed ) goto sqlite
18d80 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f  3ExprCodeIN_oom_
18d90 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74  error;..  /* Att
18da0 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20  empt to compute 
18db0 74 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74  the RHS. After t
18dc0 68 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79  his step, if any
18dd0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
18de0 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e  .  ** IN_INDEX_N
18df0 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c  OOP is returned,
18e00 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65   the table opene
18e10 64 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78  d ith cursor pEx
18e20 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a  pr->iTable .  **
18e30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
18e40 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
18e50 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
18e60 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
18e70 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
18e80 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
18e90 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
18ea0 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
18eb0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
18ec0 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
18ed0 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
18ee0 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
18ef0 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
18f00 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
18f10 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
18f20 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
18f30 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
18f40 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f60 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
18f70 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
18f80 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
18f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
18fb0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
18fc0 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
18fd0 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70  hsHasNull, aiMap
18fe0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
18ff0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56  arse->nErr || nV
19000 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70  ector==1 || eTyp
19010 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a  e==IN_INDEX_EPH.
19020 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
19030 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
19040 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e  ASC || eType==IN
19050 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
19060 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53  C .  );.#ifdef S
19070 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
19080 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69   Confirm that ai
19090 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  Map[] contains n
190a0 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76  Vector integer v
190b0 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30 20  alues between 0 
190c0 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72  and.  ** nVector
190d0 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  -1. */.  for(i=0
190e0 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
190f0 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e  ){.    int j, cn
19100 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a  t;.    for(cnt=j
19110 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a  =0; j<nVector; j
19120 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d  ++) if( aiMap[j]
19130 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20  ==i ) cnt++;.   
19140 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20   assert( cnt==1 
19150 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
19160 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53   /* Code the LHS
19170 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  , the <expr> fro
19180 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
19190 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20  .)". If the LHS 
191a0 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f  is a .  ** vecto
191b0 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73 74  r, then it is st
191c0 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79  ored in an array
191d0 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69   of nVector regi
191e0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a  sters starting .
191f0 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a    ** at r1..  **
19200 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  .  ** sqlite3Fin
19210 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74  dInIndex() might
19220 20 68 61 76 65 20 72 65 6f 72 64 65 72 65 64 20   have reordered 
19230 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  the fields of th
19240 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a  e LHS vector.  *
19250 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 69  * so that the fi
19260 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  elds are in the 
19270 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e  same order as an
19280 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e   existing index.
19290 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61     The.  ** aiMa
192a0 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  p[] array contai
192b0 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f  ns a mapping fro
192c0 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c  m the original L
192d0 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74  HS field order t
192e0 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64  o.  ** the field
192f0 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61 74 63   order that matc
19300 68 65 73 20 74 68 65 20 52 48 53 20 69 6e 64 65  hes the RHS inde
19310 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
19320 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
19330 50 61 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72  Parse);.  rLhsOr
19340 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63  ig = exprCodeVec
19350 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  tor(pParse, pLef
19360 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66  t, &iDummy);.  f
19370 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
19380 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69  r && aiMap[i]==i
19390 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20  ; i++){} /* Are 
193a0 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64  LHS fields reord
193b0 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69  ered? */.  if( i
193c0 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20  ==nVector ){.   
193d0 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61   /* LHS fields a
193e0 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64  re not reordered
193f0 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72   */.    rLhs = r
19400 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65  LhsOrig;.  }else
19410 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
19420 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53   reorder the LHS
19430 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e   fields accordin
19440 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20  g to aiMap */.  
19450 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33    rLhs = sqlite3
19460 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
19470 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  rse, nVector);. 
19480 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
19490 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
194a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
194b0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
194c0 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68   rLhsOrig+i, rLh
194d0 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a  s+aiMap[i], 0);.
194e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
194f0 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  If sqlite3FindIn
19500 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20  Index() did not 
19510 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
19520 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  n index that is.
19530 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f    ** suitable fo
19540 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  r evaluating the
19550 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68   IN operator, th
19560 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e  en evaluate usin
19570 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  g a.  ** sequenc
19580 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73  e of comparisons
19590 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
195a0 20 69 73 20 73 74 65 70 20 28 31 29 20 69 6e 20   is step (1) in 
195b0 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e  the in-operator.
195c0 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67  md optimized alg
195d0 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69  orithm..  */.  i
195e0 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
195f0 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45  EX_NOOP ){.    E
19600 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
19610 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
19620 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
19630 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
19640 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
19650 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
19660 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20      int labelOk 
19670 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19680 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
19690 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65  nt r2, regToFree
196a0 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e  ;.    int regCkN
196b0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ull = 0;.    int
196c0 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28   ii;.    assert(
196d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
196e0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
196f0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
19700 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  ( destIfNull!=de
19710 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
19720 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73     regCkNull = s
19730 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19740 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19750 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19760 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
19770 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43  rLhs, rLhs, regC
19780 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  kNull);.    }.  
19790 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
197a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  List->nExpr; ii+
197b0 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  +){.      r2 = s
197c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
197d0 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  mp(pParse, pList
197e0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26  ->a[ii].pExpr, &
197f0 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  regToFree);.    
19800 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
19810 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
19820 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61  nBeNull(pList->a
19830 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
19840 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19850 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
19860 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c  itAnd, regCkNull
19870 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r2, regCkNull)
19880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19890 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  if( ii<pList->nE
198a0 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e  xpr-1 || destIfN
198b0 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
198c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
198d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
198e0 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61   OP_Eq, rLhs, la
198f0 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20  belOk, r2,.     
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19910 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
19920 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
19930 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
19940 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69  rageIf(v, ii<pLi
19950 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
19960 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
19970 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73  geIf(v, ii==pLis
19980 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
19990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
199a0 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
199b0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
199c0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
199d0 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  t( destIfNull==d
199e0 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20  estIfFalse );.  
199f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19a00 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
19a10 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61  , rLhs, destIfFa
19a20 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a40 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
19a50 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
19a60 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19a70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19a80 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
19a90 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a  ff[0] | SQLITE_J
19aa0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
19ab0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
19ac0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19ad0 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
19ae0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
19af0 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
19b00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19b10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
19b20 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
19b30 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
19b40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
19b60 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
19b70 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se);.    }.    s
19b80 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19b90 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f  eLabel(v, labelO
19ba0 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  k);.    sqlite3R
19bb0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19bc0 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  arse, regCkNull)
19bd0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74  ;.    goto sqlit
19be0 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
19bf0 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ished;.  }..  /*
19c00 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74   Step 2: Check t
19c10 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
19c20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
19c30 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20  LL columns.  If 
19c40 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65  the.  ** LHS doe
19c50 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20  s contain NULLs 
19c60 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
19c70 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46  must be either F
19c80 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20  ALSE or NULL..  
19c90 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20  ** We will then 
19ca0 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20  skip the binary 
19cb0 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48  search of the RH
19cc0 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
19cd0 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
19ce0 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73  False ){.    des
19cf0 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46  tStep2 = destIfF
19d00 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  alse;.  }else{. 
19d10 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
19d20 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74  estStep6 = sqlit
19d30 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19d40 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  v);.  }.  for(i=
19d50 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
19d60 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
19d70 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
19d80 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78 70  ieldSubexpr(pExp
19d90 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  r->pLeft, i);.  
19da0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
19db0 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b  rCanBeNull(p) ){
19dc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19dd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19de0 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64  sNull, rLhs+i, d
19df0 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20  estStep2);.     
19e00 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
19e20 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c  * Step 3.  The L
19e30 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20  HS is now known 
19e40 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  to be non-NULL. 
19e50 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73   Do the binary s
19e60 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68  earch.  ** of th
19e70 65 20 52 48 53 20 75 73 69 6e 67 20 74 68 65 20  e RHS using the 
19e80 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20  LHS as a probe. 
19e90 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72   If found, the r
19ea0 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72  esult is.  ** tr
19eb0 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ue..  */.  if( e
19ec0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
19ed0 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OWID ){.    /* I
19ee0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
19ef0 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49   RHS is the ROWI
19f00 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65  D of table b-tre
19f10 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f  e and so we also
19f20 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61  .    ** know tha
19f30 74 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e  t the RHS is non
19f40 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77  -NULL.  Hence, w
19f50 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20  e combine steps 
19f60 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69  3 and 4.    ** i
19f70 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  nto a single opc
19f80 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ode. */.    sqli
19f90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19fa0 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70   OP_SeekRowid, p
19fb0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
19fc0 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29  stIfFalse, rLhs)
19fd0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
19fe0 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54  ge(v);.    addrT
19ff0 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33  ruthOp = sqlite3
1a000 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
1a010 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75  _Goto);  /* Retu
1a020 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c  rn True */.  }el
1a030 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
1a040 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1a050 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20  Affinity, rLhs, 
1a060 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66  nVector, 0, zAff
1a070 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
1a080 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d  if( destIfFalse=
1a090 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20  =destIfNull ){. 
1a0a0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20       /* Combine 
1a0b0 53 74 65 70 20 33 20 61 6e 64 20 53 74 65 70 20  Step 3 and Step 
1a0c0 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  5 into a single 
1a0d0 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  opcode */.      
1a0e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a0f0 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
1a100 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
1a110 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
1a120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a130 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73              rLhs
1a140 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65  , nVector); Vdbe
1a150 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a160 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45     goto sqlite3E
1a170 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1a180 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
1a190 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33   Ordinary Step 3
1a1a0 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  , for the case w
1a1b0 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e  here FALSE and N
1a1c0 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74  ULL are distinct
1a1d0 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74   */.    addrTrut
1a1e0 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  hOp = sqlite3Vdb
1a1f0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1a200 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
1a210 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20  Table, 0,.      
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a240 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20  rLhs, nVector); 
1a250 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a260 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
1a270 34 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  4.  If the RHS i
1a280 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f  s known to be no
1a290 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69  n-NULL and we di
1a2a0 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20  d not find.  ** 
1a2b0 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20  an match on the 
1a2c0 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68  search above, th
1a2d0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
1a2e0 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a  st be FALSE..  *
1a2f0 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61 73 4e  /.  if( rRhsHasN
1a300 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d  ull && nVector==
1a310 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1a320 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a330 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61  _NotNull, rRhsHa
1a340 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c  sNull, destIfFal
1a350 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  se);.    VdbeCov
1a360 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
1a370 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20   /* Step 5.  If 
1a380 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
1a390 62 6f 75 74 20 74 68 65 20 64 69 66 66 65 72 65  bout the differe
1a3a0 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c  nce between NULL
1a3b0 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c   and.  ** FALSE,
1a3c0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
1a3d0 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20  n false. .  */. 
1a3e0 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65   if( destIfFalse
1a3f0 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73  ==destIfNull ) s
1a400 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1a410 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
1a420 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f  .  /* Step 6: Lo
1a430 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20  op through rows 
1a440 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d  of the RHS.  Com
1a450 70 61 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f  pare each row to
1a460 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49   the LHS..  ** I
1a470 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e  f any comparison
1a480 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
1a490 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
1a4a0 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20  L.  If all.  ** 
1a4b0 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20  comparisons are 
1a4c0 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66  FALSE then the f
1a4d0 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46  inal result is F
1a4e0 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ALSE..  **.  ** 
1a4f0 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53  For a scalar LHS
1a500 2c 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  , it is sufficie
1a510 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74  nt to check just
1a520 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20   the first row. 
1a530 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a   ** of the RHS..
1a540 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53    */.  if( destS
1a550 74 65 70 36 20 29 20 73 71 6c 69 74 65 33 56 64  tep6 ) sqlite3Vd
1a560 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a570 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20  , destStep6);.  
1a580 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
1a590 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a5a0 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d  P_Rewind, pExpr-
1a5b0 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
1a5c0 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76  alse);.  VdbeCov
1a5d0 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
1a5e0 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
1a5f0 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73   destNotNull = s
1a600 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1a610 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  bel(v);.  }else{
1a620 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63  .    /* For nVec
1a630 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20  tor==1, combine 
1a640 73 74 65 70 73 20 36 20 61 6e 64 20 37 20 62 79  steps 6 and 7 by
1a650 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
1a660 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41  urning.    ** FA
1a670 4c 53 45 20 69 66 20 74 68 65 20 66 69 72 73 74  LSE if the first
1a680 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
1a690 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64  ot NULL */.    d
1a6a0 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73  estNotNull = des
1a6b0 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20  tIfFalse;.  }.  
1a6c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
1a6d0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  or; i++){.    Ex
1a6e0 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53  pr *p;.    CollS
1a6f0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69  eq *pColl;.    i
1a700 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47  nt r3 = sqlite3G
1a710 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1a720 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
1a730 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
1a740 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
1a750 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1a760 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1a770 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73  Parse, p);.    s
1a780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a790 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1a7a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c  Expr->iTable, i,
1a7b0 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   r3);.    sqlite
1a7c0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1a7d0 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65  P_Ne, rLhs+i, de
1a7e0 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20  stNotNull, r3,. 
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a800 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1a810 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1a820 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a830 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1a840 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1a850 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a  Parse, r3);.  }.
1a860 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a870 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1a880 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  0, destIfNull);.
1a890 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
1a8a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1a8b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a8c0 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a  , destNotNull);.
1a8d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a8e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
1a8f0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1a900 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20   addrTop+1);.   
1a910 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a920 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37  ;..    /* Step 7
1a930 3a 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74  :  If we reach t
1a940 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
1a950 6f 77 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ow that the resu
1a960 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  lt must.    ** b
1a970 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20  e false. */.    
1a980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a990 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1a9a0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1a9b0 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68   }..  /* Jumps h
1a9c0 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ere in order to 
1a9d0 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a  return true. */.
1a9e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1a9f0 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 72 75  pHere(v, addrTru
1aa00 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45  thOp);..sqlite3E
1aa10 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1aa20 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d  ed:.  if( rLhs!=
1aa30 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74  rLhsOrig ) sqlit
1aa40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1aa50 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a  (pParse, rLhs);.
1aa60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1aa70 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1aa80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1aa90 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29   "end IN expr"))
1aaa0 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ;.sqlite3ExprCod
1aab0 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20  eIN_oom_error:. 
1aac0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1aad0 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70  Parse->db, aiMap
1aae0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1aaf0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
1ab00 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Aff);.}.#endif /
1ab10 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
1ab20 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
1ab30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1ab40 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
1ab50 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
1ab60 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1ab70 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
1ab80 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
1ab90 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
1aba0 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
1abb0 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1abc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
1abd0 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
1abe0 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
1abf0 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
1ac00 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
1ac10 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
1ac20 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
1ac30 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
1ac40 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
1ac50 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
1ac60 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
1ac70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ac80 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
1ac90 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
1aca0 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
1acb0 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
1acc0 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
1acd0 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
1ace0 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  ue;.    sqlite3A
1acf0 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
1ad00 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1ad10 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
1ad20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
1ad30 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
1ad40 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
1ad50 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
1ad60 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
1ad70 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
1ad80 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
1ad90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ada0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52  dOp4Dup8(v, OP_R
1adb0 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
1adc0 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
1add0 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
1ade0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
1adf0 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
1ae00 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
1ae10 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
1ae20 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
1ae30 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
1ae40 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1ae50 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
1ae60 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
1ae70 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
1ae80 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
1ae90 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
1aea0 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
1aeb0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1aec0 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
1aed0 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
1aee0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1aef0 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
1af00 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
1af10 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
1af20 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
1af30 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
1af40 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
1af50 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
1af60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1af70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1af80 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
1af90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1afa0 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
1afb0 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
1afc0 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
1afd0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
1afe0 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
1aff0 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f   c = sqlite3DecO
1b000 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61  rHexToI64(z, &va
1b010 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 28 63  lue);.    if( (c
1b020 3d 3d 33 20 26 26 20 21 6e 65 67 46 6c 61 67 29  ==3 && !negFlag)
1b030 20 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e   || (c==2) || (n
1b040 65 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d  egFlag && value=
1b050 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29  =SMALLEST_INT64)
1b060 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1b070 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1b080 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74  OINT.      sqlit
1b090 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b0a0 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e  e, "oversized in
1b0b0 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65  teger: %s%s", ne
1b0c0 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  gFlag ? "-" : ""
1b0d0 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e  , z);.#else.#ifn
1b0e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b0f0 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20  HEX_INTEGER.    
1b100 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1b110 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29  rnicmp(z,"0x",2)
1b120 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1b130 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b140 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65  Parse, "hex lite
1b150 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25  ral too big: %s%
1b160 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a  s", negFlag?"-":
1b170 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  "",z);.      }el
1b180 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
1b190 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
1b1a0 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
1b1b0 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
1b1c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1b1d0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  e{.      if( neg
1b1e0 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
1b1f0 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==3 ? SMALLEST_
1b200 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
1b210 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1b220 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
1b230 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
1b240 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
1b250 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ue, P4_INT64);. 
1b260 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1b270 2a 20 45 72 61 73 65 20 63 6f 6c 75 6d 6e 2d 63  * Erase column-c
1b280 61 63 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65  ache entry numbe
1b290 72 20 69 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  r i.*/.static vo
1b2a0 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65  id cacheEntryCle
1b2b0 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
1b2c0 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20  , int i){.  if( 
1b2d0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1b2e0 65 5b 69 5d 2e 74 65 6d 70 52 65 67 20 29 7b 0a  e[i].tempReg ){.
1b2f0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1b300 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
1b310 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
1b320 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50  Reg) ){.      pP
1b330 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
1b340 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
1b350 2b 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  +] = pParse->aCo
1b360 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a  lCache[i].iReg;.
1b370 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
1b380 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b  se->nColCache--;
1b390 0a 20 20 69 66 28 20 69 3c 70 50 61 72 73 65 2d  .  if( i<pParse-
1b3a0 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20  >nColCache ){.  
1b3b0 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61    pParse->aColCa
1b3c0 63 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d  che[i] = pParse-
1b3d0 3e 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73  >aColCache[pPars
1b3e0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20  e->nColCache];. 
1b3f0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   }.}.../*.** Rec
1b400 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ord in the colum
1b410 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70  n cache that a p
1b420 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e  articular column
1b430 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69   from a.** parti
1b440 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73  cular table is s
1b450 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69  tored in a parti
1b460 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a  cular register..
1b470 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1b480 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61  xprCacheStore(Pa
1b490 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1b4a0 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c   iTab, int iCol,
1b4b0 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
1b4c0 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72  t i;.  int minLr
1b4d0 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b  u;.  int idxLru;
1b4e0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1b4f0 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e  che *p;..  /* Un
1b500 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61  less an error ha
1b510 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69  s occurred, regi
1b520 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65  ster numbers are
1b530 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65   always positive
1b540 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  . */.  assert( i
1b550 52 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d  Reg>0 || pParse-
1b560 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
1b570 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1b580 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  d );.  assert( i
1b590 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c  Col>=-1 && iCol<
1b5a0 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e  32768 );  /* Fin
1b5b0 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ite column numbe
1b5c0 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  rs */..  /* The 
1b5d0 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
1b5e0 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73  he flag disables
1b5f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1b600 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
1b610 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  .  ** for testin
1b620 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69  g only - to veri
1b630 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61  fy that SQLite a
1b640 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73  lways gets the s
1b650 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20  ame answer.  ** 
1b660 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74  with and without
1b670 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1b680 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70  e..  */.  if( Op
1b690 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1b6a0 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
1b6b0 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
1b6c0 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  e) ) return;..  
1b6d0 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65  /* First replace
1b6e0 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e   any existing en
1b6f0 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  try..  **.  ** A
1b700 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79  ctually, the way
1b710 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1b720 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
1b730 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72  sed, we are guar
1b740 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74  anteed.  ** that
1b750 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c   the object will
1b760 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62   never already b
1b770 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72  e in cache.  Ver
1b780 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74  ify this guarant
1b790 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ee..  */.#ifndef
1b7a0 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d   NDEBUG.  for(i=
1b7b0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1b7c0 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1b7d0 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1b7e0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , p++){.    asse
1b7f0 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69  rt( p->iTable!=i
1b800 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d  Tab || p->iColum
1b810 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23  n!=iCol );.  }.#
1b820 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
1b830 68 65 20 63 61 63 68 65 20 69 73 20 61 6c 72 65  he cache is alre
1b840 61 64 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74 65  ady full, delete
1b850 20 74 68 65 20 6c 65 61 73 74 20 72 65 63 65 6e   the least recen
1b860 74 6c 79 20 75 73 65 64 20 65 6e 74 72 79 20 2a  tly used entry *
1b870 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
1b880 6e 43 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49 54  nColCache>=SQLIT
1b890 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b 0a  E_N_COLCACHE ){.
1b8a0 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37      minLru = 0x7
1b8b0 66 66 66 66 66 66 66 3b 0a 20 20 20 20 69 64 78  fffffff;.    idx
1b8c0 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f  Lru = -1;.    fo
1b8d0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1b8e0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
1b8f0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
1b900 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1b910 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e    if( p->lru<min
1b920 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Lru ){.        i
1b930 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
1b940 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c     minLru = p->l
1b950 72 75 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ru;.      }.    
1b960 7d 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  }.    p = &pPars
1b970 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
1b980 4c 72 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Lru];.  }else{. 
1b990 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
1b9a0 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65  aColCache[pParse
1b9b0 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a  ->nColCache++];.
1b9c0 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
1b9d0 65 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74  e new entry to t
1b9e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61  he end of the ca
1b9f0 63 68 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76  che */.  p->iLev
1ba00 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
1ba10 63 68 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e 69  cheLevel;.  p->i
1ba20 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
1ba30 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
1ba40 6c 3b 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20 69  l;.  p->iReg = i
1ba50 52 65 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52 65  Reg;.  p->tempRe
1ba60 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75 20  g = 0;.  p->lru 
1ba70 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1ba80 43 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cnt++;.}../*.** 
1ba90 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65  Indicate that re
1baa0 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20  gisters between 
1bab0 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d  iReg..iReg+nReg-
1bac0 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72  1 are being over
1bad0 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67  written..** Purg
1bae0 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72  e the range of r
1baf0 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68  egisters from th
1bb00 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
1bb10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1bb20 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50  xprCacheRemove(P
1bb30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1bb40 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
1bb50 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
1bb60 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73    while( i<pPars
1bb70 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a  e->nColCache ){.
1bb80 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
1bb90 61 63 68 65 20 2a 70 20 3d 20 26 70 50 61 72 73  ache *p = &pPars
1bba0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b  e->aColCache[i];
1bbb0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
1bbc0 20 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69   >= iReg && p->i
1bbd0 52 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20  Reg < iReg+nReg 
1bbe0 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
1bbf0 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
1bc00 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   i);.    }else{.
1bc10 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
1bc20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
1bc30 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65  member the curre
1bc40 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  nt column cache 
1bc50 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65  context.  Any ne
1bc60 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a  w entries added.
1bc70 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
1bc80 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74  column cache aft
1bc90 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65  er this call are
1bca0 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68   removed when th
1bcb0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
1bcc0 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a  ng pop occurs..*
1bcd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1bce0 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73  prCachePush(Pars
1bcf0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
1bd00 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1bd10 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  l++;.#ifdef SQLI
1bd20 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1bd30 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1bd40 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
1bd50 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
1bd60 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20  printf("PUSH to 
1bd70 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69  %d\n", pParse->i
1bd80 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d  CacheLevel);.  }
1bd90 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
1bda0 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65   Remove from the
1bdb0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e   column cache an
1bdc0 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77  y entries that w
1bdd0 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20  ere added since 
1bde0 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69  the.** the previ
1bdf0 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43  ous sqlite3ExprC
1be00 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69  achePush operati
1be10 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
1be20 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20  rds, restore.** 
1be30 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
1be40 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1be50 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20   prior the most 
1be60 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a  recent Push..*/.
1be70 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1be80 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a  CachePop(Parse *
1be90 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
1bea0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1beb0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1bec0 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72  vel>=1 );.  pPar
1bed0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d  se->iCacheLevel-
1bee0 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  -;.#ifdef SQLITE
1bef0 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1bf00 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1bf10 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
1bf20 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
1bf30 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64  intf("POP  to %d
1bf40 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61  \n", pParse->iCa
1bf50 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23  cheLevel);.  }.#
1bf60 65 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20 69  endif.  while( i
1bf70 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1bf80 68 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  he ){.    if( pP
1bf90 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1bfa0 69 5d 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  i].iLevel>pParse
1bfb0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
1bfc0 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
1bfd0 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69  yClear(pParse, i
1bfe0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1bff0 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20      i++;.    }. 
1c000 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
1c010 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
1c020 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
1c030 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
1c040 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
1c050 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
1c060 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
1c070 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
1c080 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
1c090 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
1c0a0 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
1c0b0 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
1c0c0 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
1c0d0 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
1c0e0 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
1c0f0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1c100 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
1c110 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1c120 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
1c130 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1c140 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
1c150 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1c160 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1c170 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1c180 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
1c190 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
1c1a0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
1c1b0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
1c1c0 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74   }.}../* Generat
1c1d0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1c1e0 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73   load into regis
1c1f0 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c  ter regOut a val
1c200 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70  ue that is.** ap
1c210 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
1c220 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c  e iIdxCol-th col
1c230 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
1c240 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
1c250 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e  e3ExprCodeLoadIn
1c260 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  dexColumn(.  Par
1c270 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20  se *pParse,  /* 
1c280 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1c290 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
1c2a0 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20  pIdx,    /* The 
1c2b0 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75  index whose colu
1c2c0 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64  mn is to be load
1c2d0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
1c2e0 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f  Cur,    /* Curso
1c2f0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  r pointing to a 
1c300 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69  table row */.  i
1c310 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f  nt iIdxCol,    /
1c320 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  * The column of 
1c330 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  the index to be 
1c340 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
1c350 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53  regOut      /* S
1c360 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63  tore the index c
1c370 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74  olumn value in t
1c380 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1c390 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c  ){.  i16 iTabCol
1c3a0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
1c3b0 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66  n[iIdxCol];.  if
1c3c0 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58  ( iTabCol==XN_EX
1c3d0 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  PR ){.    assert
1c3e0 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
1c3f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1c400 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1c410 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b  nExpr>iIdxCol );
1c420 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65  .    pParse->iSe
1c430 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 20  lfTab = iTabCur 
1c440 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  + 1;.    sqlite3
1c450 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61  ExprCodeCopy(pPa
1c460 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45  rse, pIdx->aColE
1c470 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e  xpr->a[iIdxCol].
1c480 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a  pExpr, regOut);.
1c490 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
1c4a0 66 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  fTab = 0;.  }els
1c4b0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1c4c0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
1c4d0 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70  fTable(pParse->p
1c4e0 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62  Vdbe, pIdx->pTab
1c4f0 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20  le, iTabCur,.   
1c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c520 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74   iTabCol, regOut
1c530 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1c540 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1c550 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   extract the val
1c560 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74  ue of the iCol-t
1c570 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  h column of a ta
1c580 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
1c590 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1c5a0 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20  olumnOfTable(.  
1c5b0 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
1c5c0 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65  /* The VDBE unde
1c5d0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1c5e0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1c5f0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1c600 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1c610 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
1c620 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68  TabCur,    /* Th
1c630 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20  e table cursor. 
1c640 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f   Or the PK curso
1c650 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  r for WITHOUT RO
1c660 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  WID */.  int iCo
1c670 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  l,       /* Inde
1c680 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
1c690 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20  to extract */.  
1c6a0 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
1c6b0 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
1c6c0 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72  alue into this r
1c6d0 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1c6e0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
1c6f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c700 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1c710 6e 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c  n, iTabCur, iCol
1c720 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72  , regOut);.    r
1c730 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
1c740 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
1c750 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
1c760 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c770 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
1c780 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
1c790 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
1c7a0 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
1c7b0 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
1c7c0 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
1c7d0 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  umn;.    int x =
1c7e0 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21   iCol;.    if( !
1c7f0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
1c800 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
1c810 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20  b) ){.      x = 
1c820 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
1c830 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d  ndex(sqlite3Prim
1c840 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
1c850 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  ), iCol);.    }.
1c860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c870 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61  ddOp3(v, op, iTa
1c880 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29  bCur, x, regOut)
1c890 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1c8a0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
1c8b0 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
1c8c0 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72  v, pTab, iCol, r
1c8d0 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
1c8e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1c8f0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  de that will ext
1c900 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e  ract the iColumn
1c910 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  -th column from.
1c920 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  ** table pTab an
1c930 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  d store the colu
1c940 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65  mn value in a re
1c950 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41  gister. .**.** A
1c960 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
1c970 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
1c980 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
1c990 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68  gister iReg.  Th
1c9a0 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72  is.** is not gar
1c9b0 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74 43  anteeed for GetC
1c9c0 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65  olumn() - the re
1c9d0 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72  sult can be stor
1c9e0 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67  ed in.** any reg
1c9f0 69 73 74 65 72 2e 20 20 42 75 74 20 74 68 65 20  ister.  But the 
1ca00 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e  result is guaran
1ca10 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20  teed to land in 
1ca20 72 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a  register iReg.**
1ca30 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f   for GetColumnTo
1ca40 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Reg()..**.** The
1ca50 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
1ca60 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
1ca70 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e  b in iTable when
1ca80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1ca90 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20   is called.  If 
1caa0 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
1cab0 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
1cac0 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
1cad0 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  he rowid..*/.int
1cae0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1caf0 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  GetColumn(.  Par
1cb00 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1cb10 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1cb20 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1cb30 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1cb40 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1cb50 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1cb60 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1cb70 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1cb80 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1cb90 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1cba0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1cbb0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1cbc0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1cbd0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1cbe0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1cbf0 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a   iReg,        /*
1cc00 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1cc10 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  ere */.  u8 p5  
1cc20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20            /* P5 
1cc30 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c  value for OP_Col
1cc40 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29  umn + FLAGS */.)
1cc50 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1cc60 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1cc70 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1cc80 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
1cc90 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1cca0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1ccb0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1ccc0 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
1ccd0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d    if( p->iTable=
1cce0 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43  =iTable && p->iC
1ccf0 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
1cd00 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d  {.      p->lru =
1cd10 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
1cd20 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
1cd30 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52  te3ExprCachePinR
1cd40 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
1cd50 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20  p->iReg);.      
1cd60 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a  return p->iReg;.
1cd70 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73      }.  }  .  as
1cd80 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
1cd90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1cda0 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1cdb0 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c  v, pTab, iTable,
1cdc0 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1cdd0 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20  .  if( p5 ){.   
1cde0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1cdf0 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d  geP5(v, p5);.  }
1ce00 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c  else{   .    sql
1ce10 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1ce20 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c  re(pParse, iTabl
1ce30 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
1ce40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ce50 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  iReg;.}.void sql
1ce60 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1ce70 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61  olumnToReg(.  Pa
1ce80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
1ce90 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1cea0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1ceb0 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
1cec0 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
1ced0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1cee0 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
1cef0 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
1cf00 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
1cf10 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1cf20 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
1cf30 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1cf40 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1cf50 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
1cf60 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1cf70 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20 2f  t iReg         /
1cf80 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
1cf90 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1cfa0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1cfb0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
1cfc0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f  Parse, pTab, iCo
1cfd0 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52  lumn, iTable, iR
1cfe0 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31  eg, 0);.  if( r1
1cff0 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65 33  !=iReg ) sqlite3
1d000 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
1d010 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
1d020 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d  py, r1, iReg);.}
1d030 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  .../*.** Clear a
1d040 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
1d050 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64  entries..*/.void
1d060 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1d070 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  eClear(Parse *pP
1d080 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
1d090 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1d0a0 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1d0b0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1d0c0 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1d0d0 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1d0e0 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20  tf("CLEAR\n");. 
1d0f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
1d100 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
1d110 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a  ColCache; i++){.
1d120 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1d130 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d  aColCache[i].tem
1d140 70 52 65 67 0a 20 20 20 20 20 26 26 20 70 50 61  pReg.     && pPa
1d150 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
1d160 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
1d170 61 54 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b  aTempReg).    ){
1d180 0a 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  .       pParse->
1d190 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
1d1a0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
1d1b0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1d1c0 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a  [i].iReg;.    }.
1d1d0 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43    }.  pParse->nC
1d1e0 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a  olCache = 0;.}..
1d1f0 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
1d200 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66   fact that an af
1d210 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
1d220 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43  s occurred on iC
1d230 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  ount.** register
1d240 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
1d250 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20  iStart..*/.void 
1d260 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1d270 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50  AffinityChange(P
1d280 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1d290 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43  t iStart, int iC
1d2a0 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  ount){.  sqlite3
1d2b0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1d2c0 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20  pParse, iStart, 
1d2d0 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCount);.}../*.*
1d2e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d2f0 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
1d300 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
1d310 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
1d320 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
1d330 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20  To..iTo+nReg-1. 
1d340 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
1d350 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
1d360 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d370 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
1d380 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1d390 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
1d3a0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73   int nReg){.  as
1d3b0 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f  sert( iFrom>=iTo
1d3c0 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e  +nReg || iFrom+n
1d3d0 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71  Reg<=iTo );.  sq
1d3e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d3f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1d400 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
1d410 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c  To, nReg);.  sql
1d420 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1d430 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f  ove(pParse, iFro
1d440 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66  m, nReg);.}..#if
1d450 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1d460 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1d470 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  d(SQLITE_COVERAG
1d480 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1d490 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
1d4a0 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
1d4b0 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54   range iFrom..iT
1d4c0 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a  o (inclusive).**
1d4d0 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
1d4e0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   of the column c
1d4f0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
1d500 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1d510 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
1d520 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20   and testcase() 
1d530 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61  macros only.** a
1d540 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  nd does not appe
1d550 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62  ar in a normal b
1d560 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
1d570 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  int usedAsColumn
1d580 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
1d590 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
1d5a0 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20  int iTo){.  int 
1d5b0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1d5c0 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
1d5d0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1d5e0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1d5f0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1d600 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
1d610 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
1d620 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20     if( r>=iFrom 
1d630 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75  && r<=iTo ) retu
1d640 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45  rn 1;    /*NO_TE
1d650 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ST*/.  }.  retur
1d660 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
1d670 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c   SQLITE_DEBUG ||
1d680 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45   SQLITE_COVERAGE
1d690 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  _TEST */.../*.**
1d6a0 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61   Convert a scala
1d6b0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  r expression nod
1d6c0 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  e to a TK_REGIST
1d6d0 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a  ER referencing.*
1d6e0 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  * register iReg.
1d6f0 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73    The caller mus
1d700 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 52  t ensure that iR
1d710 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  eg already conta
1d720 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ins.** the corre
1d730 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  ct value for the
1d740 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
1d750 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
1d760 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20  ToRegister(Expr 
1d770 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  *p, int iReg){. 
1d780 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b   p->op2 = p->op;
1d790 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  .  p->op = TK_RE
1d7a0 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61  GISTER;.  p->iTa
1d7b0 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78  ble = iReg;.  Ex
1d7c0 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
1d7d0 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a  p, EP_Skip);.}..
1d7e0 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61  /*.** Evaluate a
1d7f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69  n expression (ei
1d800 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72  ther a vector or
1d810 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
1d820 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a  sion) and store.
1d830 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  ** the result in
1d840 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d   continguous tem
1d850 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1d860 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1d870 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  dex of.** the fi
1d880 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65  rst register use
1d890 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  d to store the r
1d8a0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  esult..**.** If 
1d8b0 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1d8c0 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
1d8d0 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c  a temporary scal
1d8e0 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  ar, then also wr
1d8f0 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69  ite.** that regi
1d900 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f  ster number into
1d910 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49   *piFreeable.  I
1d920 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1d930 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a  esult register.*
1d940 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  * is not a tempo
1d950 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65  rary or if the e
1d960 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
1d970 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65  ector set *piFre
1d980 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a  eable.** to 0..*
1d990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1d9a0 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
1d9b0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1d9c0 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61  *p, int *piFreea
1d9d0 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73  ble){.  int iRes
1d9e0 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75  ult;.  int nResu
1d9f0 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
1da00 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20  VectorSize(p);. 
1da10 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20   if( nResult==1 
1da20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d  ){.    iResult =
1da30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1da40 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Temp(pParse, p, 
1da50 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d  piFreeable);.  }
1da60 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65  else{.    *piFre
1da70 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69  eable = 0;.    i
1da80 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  f( p->op==TK_SEL
1da90 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ECT ){.#if SQLIT
1daa0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1dab0 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20        iResult = 
1dac0 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  0;.#else.      i
1dad0 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
1dae0 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
1daf0 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  arse, p, 0, 0);.
1db00 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1db10 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1db20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70       iResult = p
1db30 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1db40 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
1db50 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20  m += nResult;.  
1db60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1db70 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20  Result; i++){.  
1db80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1db90 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
1dba0 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69  pParse, p->x.pLi
1dbb0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1dbc0 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  i+iResult);.    
1dbd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1dbe0 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a  return iResult;.
1dbf0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1dc00 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1dc10 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1dc20 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1dc30 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1dc40 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1dc50 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1dc60 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1dc70 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1dc80 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1dc90 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1dca0 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1dcb0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1dcc0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1dcd0 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1dce0 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1dcf0 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1dd00 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1dd10 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1dd20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1dd30 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1dd40 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1dd50 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1dd60 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1dd70 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1dd80 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1dd90 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1dda0 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1ddb0 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1ddc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ddd0 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1dde0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1ddf0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1de00 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1de10 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1de20 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1de30 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1de40 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1de50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1de60 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1de70 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1de80 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1de90 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1dea0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1deb0 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1dec0 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1ded0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1dee0 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1def0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1df00 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1df10 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1df20 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1df30 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1df40 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1df50 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1df60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1df70 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1df80 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20  mbers */.  Expr 
1df90 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20  tempX;          
1dfa0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
1dfb0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  y expression nod
1dfc0 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20  e */.  int p5 = 
1dfd0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  0;..  assert( ta
1dfe0 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
1dff0 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
1e000 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
1e010 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1e020 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1e030 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
1e040 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
1e050 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
1e060 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
1e070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
1e080 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
1e090 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1e0a0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1e0b0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1e0c0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1e0d0 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
1e0e0 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
1e0f0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1e100 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
1e110 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
1e120 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
1e130 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
1e140 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
1e150 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
1e160 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  m>0 );.        r
1e170 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d  eturn pCol->iMem
1e180 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e190 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
1e1a0 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
1e1b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e1c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1e1d0 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
1e1e0 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20  ortingIdxPTab,. 
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1e210 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1e220 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e230 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e250 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
1e260 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
1e270 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
1e280 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
1e290 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
1e2a0 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20       int iTab = 
1e2b0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1e2c0 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
1e2d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e2e0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c  Parse->iSelfTab<
1e2f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1e300 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1e310 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1e320 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1e330 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1e340 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1e350 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  rn pExpr->iColum
1e360 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  n - pParse->iSel
1e370 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65  fTab;.        }e
1e380 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1e390 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1e3a0 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1e3b0 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1e3c0 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1e3d0 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1e3e0 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1e3f0 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1e400 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1e410 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1e420 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1e430 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1e440 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 1;.        }. 
1e450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1e460 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1e470 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1e480 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
1e490 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4b0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1e4c0 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20   iTab, target,. 
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1e4f0 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d  xpr->op2);.    }
1e500 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1e510 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
1e520 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1e530 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
1e540 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1e550 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1e560 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e570 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1e580 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
1e590 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  LOAT: {.      as
1e5a0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e5b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e5c0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1e5d0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1e5e0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1e5f0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1e600 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e610 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1e620 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
1e630 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
1e640 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1e650 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1e660 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1e670 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
1e680 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74  String(v, target
1e690 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1e6a0 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
1e6b0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
1e6c0 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
1e6d0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1e6e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e6f0 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
1e700 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e710 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
1e720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e730 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
1e740 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
1e750 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
1e760 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1e770 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20   *z;.      char 
1e780 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73  *zBlob;.      as
1e790 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e7a0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e7b0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1e7c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e7d0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1e7e0 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e  'x' || pExpr->u.
1e7f0 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29  zToken[0]=='X' )
1e800 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e810 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e820 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
1e830 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e    z = &pExpr->u.
1e840 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20  zToken[2];.     
1e850 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1e860 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20  en30(z) - 1;.   
1e870 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d     assert( z[n]=
1e880 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
1e890 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65  Blob = sqlite3He
1e8a0 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56  xToBlob(sqlite3V
1e8b0 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b  dbeDb(v), z, n);
1e8c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e8d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
1e8e0 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74  lob, n/2, target
1e8f0 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44  , 0, zBlob, P4_D
1e900 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72  YNAMIC);.      r
1e910 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e920 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1e930 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
1e940 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1e950 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e960 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1e970 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
1e980 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1e990 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
1e9a0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e9b0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
1e9c0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1e9d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e9e0 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
1e9f0 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
1ea00 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
1ea10 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1ea20 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
1ea30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1ea40 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54  sqlite3VListNumT
1ea50 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56  oName(pParse->pV
1ea60 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f  List, pExpr->iCo
1ea70 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  lumn);.        a
1ea80 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1ea90 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c  zToken[0]=='?' |
1eaa0 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e  | strcmp(pExpr->
1eab0 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20  u.zToken, z)==0 
1eac0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
1ead0 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30  e->pVList[0] = 0
1eae0 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c  ; /* Indicate VL
1eaf0 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65  ist may no longe
1eb00 72 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  r be enlarged */
1eb10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1eb20 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
1eb30 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41  (char*)z, P4_STA
1eb40 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
1eb50 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1eb60 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
1eb70 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
1eb80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45  .      return pE
1eb90 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1eba0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1ebb0 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
1ebc0 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
1ebd0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
1ebe0 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
1ebf0 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
1ec00 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
1ec10 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1ec20 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1ec30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ec40 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
1ec50 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
1ec60 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
1ec70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ec80 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
1ec90 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
1eca0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1ecb0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
1ecc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ecd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1ece0 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  ast, target,.   
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69       sqlite3Affi
1ed10 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e  nityType(pExpr->
1ed20 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20  u.zToken, 0));. 
1ed30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75       testcase( u
1ed40 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1ed50 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1ed60 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20  inReg) );.      
1ed70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ed80 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1ed90 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29  Parse, inReg, 1)
1eda0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  ;.      return i
1edb0 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  nReg;.    }.#end
1edc0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1edd0 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
1ede0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1edf0 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
1ee00 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
1ee10 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
1ee20 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20  _NE;.      p5 = 
1ee30 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
1ee40 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72       /* fall-thr
1ee50 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
1ee60 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1ee70 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1ee80 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1ee90 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1eea0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1eeb0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1eec0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
1eed0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1eee0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1eef0 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29  rIsVector(pLeft)
1ef00 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1ef10 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50  VectorCompare(pP
1ef20 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1ef30 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20  get, op, p5);.  
1ef40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ef50 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1ef60 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ef70 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46  se, pLeft, &regF
1ef80 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
1ef90 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1efa0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1efb0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1efc0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1efd0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1efe0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45  Parse, pLeft, pE
1eff0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1f000 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c  .            r1,
1f010 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
1f020 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29  TE_STOREP2 | p5)
1f030 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f040 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
1f050 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f060 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
1f070 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
1f080 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f090 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
1f0a0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f0b0 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
1f0c0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
1f0d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f0e0 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
1f0f0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f100 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
1f110 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
1f120 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f130 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
1f140 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f150 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
1f160 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
1f170 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f180 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
1f190 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f1a0 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
1f1b0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
1f1c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f1d0 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
1f1e0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f1f0 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ne); VdbeCoverag
1f200 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29  eIf(v,op==OP_Ne)
1f210 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f220 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f230 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f240 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1f250 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1f260 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f270 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
1f280 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
1f290 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
1f2a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
1f2b0 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
1f2c0 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
1f2d0 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
1f2e0 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
1f2f0 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
1f300 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
1f310 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
1f320 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
1f330 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
1f340 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
1f350 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f360 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
1f370 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1f380 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
1f390 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f3a0 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29  ( TK_OR==OP_Or )
1f3b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ;              t
1f3c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f3d0 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
1f3e0 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
1f3f0 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  Add );          
1f400 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f410 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20  K_PLUS );.      
1f420 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
1f430 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
1f440 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f450 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20  p==TK_MINUS );. 
1f460 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f470 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
1f480 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  r );      testca
1f490 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29  se( op==TK_REM )
1f4a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f4b0 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69  TK_BITAND==OP_Bi
1f4c0 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73  tAnd );      tes
1f4d0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1f4e0 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  TAND );.      as
1f4f0 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d  sert( TK_BITOR==
1f500 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20  OP_BitOr );     
1f510 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f520 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20  =TK_BITOR );.   
1f530 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
1f540 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
1f550 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;       testcase
1f560 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
1f570 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f580 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
1f590 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73  iftLeft );   tes
1f5a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53  tcase( op==TK_LS
1f5b0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
1f5c0 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d  sert( TK_RSHIFT=
1f5d0 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29  =OP_ShiftRight )
1f5e0 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1f5f0 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20  =TK_RSHIFT );.  
1f600 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
1f610 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
1f620 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1f630 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54  e( op==TK_CONCAT
1f640 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1f650 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f660 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f670 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1f680 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1f690 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f6a0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f6b0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1f6c0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree2);.      sql
1f6d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1f6e0 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61  , op, r2, r1, ta
1f6f0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73  rget);.      tes
1f700 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f710 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1f720 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1f730 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1f740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f750 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
1f760 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
1f770 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1f780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1f790 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eft );.      if(
1f7a0 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
1f7b0 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
1f7c0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
1f7d0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20  arse, pLeft, 1, 
1f7e0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1f7f0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1f800 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f810 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1f820 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  NT.      }else i
1f830 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1f840 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
1f850 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1f860 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1f870 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1f880 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  ;.        codeRe
1f890 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a  al(v, pLeft->u.z
1f8a0 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74  Token, 1, target
1f8b0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1f8c0 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66  n target;.#endif
1f8d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f8e0 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d        tempX.op =
1f8f0 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20   TK_INTEGER;.   
1f900 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73       tempX.flags
1f910 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45   = EP_IntValue|E
1f920 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
1f930 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61       tempX.u.iVa
1f940 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lue = 0;.       
1f950 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f960 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f970 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72  , &tempX, &regFr
1f980 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1f990 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f9a0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f9b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1f9c0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20  gFree2);.       
1f9d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f9e0 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63  p3(v, OP_Subtrac
1f9f0 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  t, r2, r1, targe
1fa00 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
1fa10 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1fa20 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1fa30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fa40 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
1fa50 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
1fa60 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
1fa70 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
1fa80 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74  OP_BitNot );   t
1fa90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1faa0 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  BITNOT );.      
1fab0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d  assert( TK_NOT==
1fac0 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20  OP_Not );       
1fad0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fae0 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_NOT );.      
1faf0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1fb00 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1fb10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1fb20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1fb30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1fb40 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1fb50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fb60 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
1fb70 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
1fb80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fb90 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1fba0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1fbb0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
1fbc0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1fbd0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1fbe0 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
1fbf0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1fc00 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
1fc10 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
1fc20 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
1fc30 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1fc40 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1fc50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fc60 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1fc70 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1fc80 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1fc90 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fca0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1fcb0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1fcc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1fcd0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1fce0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
1fcf0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
1fd00 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  p, r1);.      Vd
1fd10 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1fd20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
1fd30 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1fd40 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1fd50 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  OTNULL);.      s
1fd60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fd70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1fd80 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1fd90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1fda0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
1fdb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fdc0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1fdd0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
1fde0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
1fdf0 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1fe00 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
1fe10 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
1fe20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1fe30 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1fe40 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1fe50 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
1fe60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1fe70 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
1fe80 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
1fe90 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1fea0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1feb0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fec0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
1fed0 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
1fee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1fef0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ff00 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
1ff10 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
1ff20 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
1ff30 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
1ff40 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1ff50 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67  .      int nFarg
1ff60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ff70 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74   Number of funct
1ff80 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1ff90 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
1ffa0 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  pDef;         /*
1ffb0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65   The function de
1ffc0 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20  finition object 
1ffd0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
1ffe0 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
1fff0 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
20000 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33  name */.      u3
20010 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  2 constMask = 0;
20020 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
20030 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
20040 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
20050 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
20060 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
20070 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
20080 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71  nter */.      sq
20090 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
200a0 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
200b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
200c0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ion */.      u8 
200d0 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  enc = ENC(db);  
200e0 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
200f0 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
20100 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
20110 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
20120 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f  *pColl = 0;    /
20130 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  * A collating se
20140 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20  quence */..     
20150 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
20160 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20 73 71  Ok(pParse) && sq
20170 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
20180 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
20190 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
201a0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  SQL functions ca
201b0 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20  n be expensive. 
201c0 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63  So try to move c
201d0 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e  onstant function
201e0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  s.        ** out
201f0 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
20200 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  op, even if that
20210 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20   means an extra 
20220 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20  OP_Copy. */.    
20230 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
20240 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
20250 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
20260 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
20270 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
20280 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
20290 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
202a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
202b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
202c0 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
202d0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
202e0 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
202f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
20300 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
20310 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
20320 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72      nFarg = pFar
20330 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72  g ? pFarg->nExpr
20340 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   : 0;.      asse
20350 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
20360 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
20370 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
20380 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75    zId = pExpr->u
20390 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70  .zToken;.      p
203a0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
203b0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
203c0 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  d, nFarg, enc, 0
203d0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
203e0 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f  _ENABLE_UNKNOWN_
203f0 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20  SQL_FUNCTION.   
20400 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26     if( pDef==0 &
20410 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  & pParse->explai
20420 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  n ){.        pDe
20430 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
20440 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b  unction(db, "unk
20450 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e  nown", nFarg, en
20460 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  c, 0);.      }.#
20470 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
20480 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d  pDef==0 || pDef-
20490 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
204a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
204b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
204c0 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69   "unknown functi
204d0 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b  on: %s()", zId);
204e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
204f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
20500 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65  * Attempt a dire
20510 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ct implementatio
20520 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  n of the built-i
20530 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  n COALESCE() and
20540 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c  .      ** IFNULL
20550 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  () functions.  T
20560 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63  his avoids unnec
20570 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f  essary evaluatio
20580 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
20590 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
205a0 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
205b0 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
205c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
205d0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
205e0 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45  QLITE_FUNC_COALE
205f0 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  SCE ){.        i
20600 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d  nt endCoalesce =
20610 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
20620 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
20630 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
20640 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =2 );.        sq
20650 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
20660 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
20670 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
20680 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
20690 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  1; i<nFarg; i++)
206a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
206b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
206c0 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72   OP_NotNull, tar
206d0 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  get, endCoalesce
206e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
206f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
20700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20710 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
20720 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31  Parse, target, 1
20730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
20740 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
20750 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
20760 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20770 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
20780 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  rg->a[i].pExpr, 
20790 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
207a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
207b0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
207c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
207d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
207e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
207f0 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
20800 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20810 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  }..      /* The 
20820 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74  UNLIKELY() funct
20830 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
20840 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
20850 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
20860 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61  * of the first a
20870 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
20880 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
20890 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
208a0 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
208b0 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LY ){.        as
208c0 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29  sert( nFarg>=1 )
208d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
208e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
208f0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
20900 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
20910 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
20920 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
20930 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a  E_DEBUG.      /*
20940 20 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20   The AFFINITY() 
20950 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74  function evaluat
20960 65 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  es to a string t
20970 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20  hat describes.  
20980 20 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20      ** the type 
20990 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
209a0 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20  argument.  This 
209b0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
209c0 69 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ing of.      ** 
209d0 74 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20  the SQLite type 
209e0 6c 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  logic..      */.
209f0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
20a00 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
20a10 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59  TE_FUNC_AFFINITY
20a20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
20a30 74 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20  t char *azAff[] 
20a40 3d 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78  = { "blob", "tex
20a50 74 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22  t", "numeric", "
20a60 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22  integer", "real"
20a70 20 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   };.        char
20a80 20 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73   aff;.        as
20a90 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
20aa0 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20  ;.        aff = 
20ab0 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
20ac0 69 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  ity(pFarg->a[0].
20ad0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
20ae0 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
20af0 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
20b00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 61 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d  aff ? azAff[aff-
20b30 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d  SQLITE_AFF_BLOB]
20b40 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20   : "none");.    
20b50 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
20b60 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  t;.      }.#endi
20b70 66 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f..      for(i=0
20b80 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
20b90 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33  .        if( i<3
20ba0 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  2 && sqlite3Expr
20bb0 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67  IsConstant(pFarg
20bc0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
20bd0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
20be0 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20  ase( i==31 );.  
20bf0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
20c00 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69  k |= MASKBIT32(i
20c10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20c20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
20c30 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
20c40 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
20c50 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29  )!=0 && !pColl )
20c60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
20c70 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
20c80 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
20c90 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
20ca0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20cb0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
20cc0 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
20cd0 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b  if( constMask ){
20ce0 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
20cf0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
20d00 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
20d10 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b  ->nMem += nFarg;
20d20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
20d30 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73            r1 = s
20d40 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
20d50 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67  ge(pParse, nFarg
20d60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
20d70 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e        /* For len
20d80 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66  gth() and typeof
20d90 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74  () functions wit
20da0 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d  h a column argum
20db0 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ent,.        ** 
20dc0 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d  set the P5 param
20dd0 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43  eter to the OP_C
20de0 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20  olumn opcode to 
20df0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
20e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f  .        ** or O
20e10 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
20e20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f  respectively, to
20e30 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
20e40 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20  ry data.        
20e50 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20  ** loading..    
20e60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
20e70 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
20e80 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55  ags & (SQLITE_FU
20e90 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45  NC_LENGTH|SQLITE
20ea0 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d  _FUNC_TYPEOF))!=
20eb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
20ec0 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20  8 exprOp;.      
20ed0 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
20ee0 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
20ef0 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d    assert( pFarg-
20f00 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
20f10 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72  ;.          expr
20f20 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  Op = pFarg->a[0]
20f30 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20  .pExpr->op;.    
20f40 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70        if( exprOp
20f50 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65  ==TK_COLUMN || e
20f60 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  xprOp==TK_AGG_CO
20f70 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
20f80 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
20f90 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d  TE_FUNC_LENGTH==
20fa0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
20fb0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
20fc0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
20fd0 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c  UNC_TYPEOF==OPFL
20fe0 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a  AG_TYPEOFARG );.
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
21000 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63  case( pDef->func
21010 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c  Flags & OPFLAG_L
21020 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
21030 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61          pFarg->a
21040 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d  [0].pExpr->op2 =
21050 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
21060 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c      pDef->funcFl
21070 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45  ags & (OPFLAG_LE
21080 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54  NGTHARG|OPFLAG_T
21090 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
210a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
210b0 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
210c0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
210d0 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54  Parse);     /* T
210e0 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
210f0 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  be */.        sq
21100 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
21110 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
21120 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20  arg, r1, 0,.    
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
21150 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
21160 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b  TE_ECEL_FACTOR);
21170 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21180 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
21190 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69  rse);      /* Ti
211a0 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
211b0 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  e */.      }else
211c0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30  {.        r1 = 0
211d0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
211e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
211f0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
21200 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
21210 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
21220 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
21230 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
21240 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
21250 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
21260 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
21270 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
21280 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
21290 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
212a0 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
212b0 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
212c0 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
212d0 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
212e0 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
212f0 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
21300 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
21310 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
21320 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
21330 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
21340 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
21350 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
21360 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
21370 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
21380 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
21390 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
213a0 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
213b0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
213c0 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
213d0 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
213e0 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
213f0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
21400 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
21410 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
21420 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
21430 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
21440 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
21450 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
21460 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
21470 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
21480 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
21490 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
214a0 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70  Farg>=2 && (pExp
214b0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
214c0 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
214d0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
214e0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
214f0 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
21500 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
21510 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
21520 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72    }else if( nFar
21530 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
21540 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
21550 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
21560 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
21570 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  g, pFarg->a[0].p
21580 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
21590 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
215a0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
215b0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
215c0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
215d0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
215e0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
215f0 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
21600 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
21610 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
21620 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
21630 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
21640 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
21650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21660 64 4f 70 34 28 76 2c 20 70 50 61 72 73 65 2d 3e  dOp4(v, pParse->
21670 69 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50 75  iSelfTab ? OP_Pu
21680 72 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75 6e  reFunc0 : OP_Fun
21690 63 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20 20  ction0,.        
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216b0 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
216c0 61 72 67 65 74 2c 20 28 63 68 61 72 2a 29 70 44  arget, (char*)pD
216d0 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
216e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
216f0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
21700 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  8)nFarg);.      
21710 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e  if( nFarg && con
21720 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20  stMask==0 ){.   
21730 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
21740 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
21750 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
21760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
21770 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
21780 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
21790 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
217a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
217b0 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
217c0 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
217d0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
217e0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
217f0 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
21800 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
21810 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
21820 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45     if( op==TK_SE
21830 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20  LECT && (nCol = 
21840 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21850 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
21860 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
21870 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
21880 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f  rror(pParse, nCo
21890 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 1);.      }el
218a0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
218b0 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  rn sqlite3CodeSu
218c0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
218d0 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
218e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
218f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
21900 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  e TK_SELECT_COLU
21910 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  MN: {.      int 
21920 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  n;.      if( pEx
21930 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
21940 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
21950 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54  pExpr->pLeft->iT
21960 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f  able = sqlite3Co
21970 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
21980 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
21990 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
219a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
219b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Expr->iTable==0 
219c0 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  || pExpr->pLeft-
219d0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
219e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
219f0 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  r->iTable.      
21a00 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
21a10 65 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45  e!=(n = sqlite3E
21a20 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
21a30 78 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20  xpr->pLeft)) .  
21a40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
21a50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21a60 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d  Parse, "%d colum
21a70 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76  ns assigned %d v
21a80 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20  alues",.        
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
21ab0 54 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20  Table, n);.     
21ac0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
21ad0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54  pExpr->pLeft->iT
21ae0 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43  able + pExpr->iC
21af0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  olumn;.    }.   
21b00 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
21b10 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
21b20 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
21b30 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
21b40 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
21b50 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
21b60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
21b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21b80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
21b90 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
21ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21bb0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
21bc0 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
21bd0 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
21be0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21bf0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21c00 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
21c10 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
21c20 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
21c30 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
21c40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21c50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21c60 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
21c70 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
21c80 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21c90 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
21ca0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21cb0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
21cc0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
21cd0 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
21ce0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
21cf0 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
21d00 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
21d10 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
21d20 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
21d30 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
21d40 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
21d50 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
21d60 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
21d70 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
21d80 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
21d90 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
21da0 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
21db0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
21dc0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
21dd0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
21de0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
21df0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
21e00 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
21e10 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c  Expr, target, 0,
21e20 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
21e30 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
21e40 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
21e50 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
21e60 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
21e70 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
21e80 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
21e90 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
21ea0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
21eb0 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
21ec0 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
21ed0 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20  K_TRIGGER: {.   
21ee0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63     /* If the opc
21ef0 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45  ode is TK_TRIGGE
21f00 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  R, then the expr
21f10 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65  ession is a refe
21f20 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74  rence.      ** t
21f30 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  o a column in th
21f40 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  e new.* or old.*
21f50 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61   pseudo-tables a
21f60 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20  vailable to.    
21f70 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f    ** trigger pro
21f80 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63  grams. In this c
21f90 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20  ase Expr.iTable 
21fa0 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20  is set to 1 for 
21fb0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77  the.      ** new
21fc0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
21fd0 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c   or 0 for the ol
21fe0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
21ff0 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20  . Expr.iColumn. 
22000 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
22010 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  o the column of 
22020 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  the pseudo-table
22030 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20   to read, or to 
22040 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  -1 to.      ** r
22050 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69  ead the rowid fi
22060 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eld..      **.  
22070 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65      ** The expre
22080 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ssion is impleme
22090 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50  nted using an OP
220a0 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54  _Param opcode. T
220b0 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70  he p1.      ** p
220c0 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20  arameter is set 
220d0 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e  to 0 for an old.
220e0 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
220f0 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20   or to (i+1).   
22100 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e     ** to referen
22110 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d  ce another colum
22120 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70  n of the old.* p
22130 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65  seudo-table, whe
22140 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69  re .      ** i i
22150 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
22160 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61  he column. For a
22170 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72   new.rowid refer
22180 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20  ence, p1 is.    
22190 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31    ** set to (n+1
221a0 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68  ), where n is th
221b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
221c0 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75  mns in each pseu
221d0 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  do-table..      
221e0 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e  ** For a referen
221f0 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20  ce to any other 
22200 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
22210 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
22220 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73  , p1.      ** is
22230 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c   set to (n+2+i),
22240 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61   where n and i a
22250 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72  re as defined pr
22260 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20  eviously. For.  
22270 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20      ** example, 
22280 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  if the table on 
22290 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61  which triggers a
222a0 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69  re being fired i
222b0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61  s.      ** decla
222c0 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a  red as:.      **
222d0 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41  .      **   CREA
222e0 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
222f0 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  );.      **.    
22300 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20    ** Then p1 is 
22310 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
22320 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
22330 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
22340 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f  0   ->    old.ro
22350 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20  wid     p1==3   
22360 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a  ->    new.rowid.
22370 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31        **   p1==1
22380 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20     ->    old.a  
22390 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d         p1==4   -
223a0 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20  >    new.a.     
223b0 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e   **   p1==2   ->
223c0 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20      old.b       
223d0 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20    p1==5   ->    
223e0 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20  new.b       .   
223f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
22400 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d  e *pTab = pExpr-
22410 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  >pTab;.      int
22420 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61   p1 = pExpr->iTa
22430 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f  ble * (pTab->nCo
22440 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72  l+1) + 1 + pExpr
22450 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20  ->iColumn;..    
22460 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
22470 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
22480 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29  xpr->iTable==1 )
22490 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
224a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
224b0 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  -1 && pExpr->iCo
224c0 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  lumn<pTab->nCol 
224d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
224e0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
224f0 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  | pExpr->iColumn
22500 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b  !=pTab->iPKey );
22510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22520 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62  1>=0 && p1<(pTab
22530 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a  ->nCol*2+2) );..
22540 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22550 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61  eAddOp2(v, OP_Pa
22560 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29  ram, p1, target)
22570 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
22580 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d  ent((v, "%s.%s -
22590 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20  > $%d",.        
225a0 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f  (pExpr->iTable ?
225b0 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c   "new" : "old"),
225c0 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
225d0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f  >iColumn<0 ? "ro
225e0 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54  wid" : pExpr->pT
225f0 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
22600 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c  iColumn].zName),
22610 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a  .        target.
22620 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64        ));..#ifnd
22630 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
22640 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
22650 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
22660 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66  lumn has REAL af
22670 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63  finity, it may c
22680 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
22690 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a  ed as an.      *
226a0 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f  * integer. Use O
226b0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74  P_RealAffinity t
226c0 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
226d0 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20  s really real.. 
226e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
226f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
22700 36 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69  60985-57662 SQLi
22710 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20  te will convert 
22720 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74  the value back t
22730 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74  o.      ** float
22740 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65  ing point when e
22750 78 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f  xtracting it fro
22760 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a  m the record.  *
22770 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  /.      if( pExp
22780 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20  r->iColumn>=0 . 
22790 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61        && pTab->a
227a0 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
227b0 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  mn].affinity==SQ
227c0 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
227d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
227e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
227f0 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
22800 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ity, target);.  
22810 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22820 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22830 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43  .    case TK_VEC
22840 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TOR: {.      sql
22850 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
22860 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
22870 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20  misused");.     
22880 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
22890 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
228a0 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20  LL_ROW: {.      
228b0 69 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20  int addrINR;.   
228c0 20 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c     addrINR = sql
228d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
228e0 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20  , OP_IfNullRow, 
228f0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
22900 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22910 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
22920 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  e);.      inReg 
22930 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
22940 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
22950 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
22960 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
22970 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
22980 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
22990 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
229a0 65 72 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b  ere(v, addrINR);
229b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
229c0 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
229d0 64 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20  drINR, inReg);. 
229e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
229f0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
22a00 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
22a10 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
22a20 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
22a30 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
22a40 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
22a50 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
22a60 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
22a70 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
22a80 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
22a90 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
22aa0 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
22ab0 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
22ac0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
22ad0 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
22ae0 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
22af0 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
22b00 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
22b10 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
22b20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
22b30 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
22b40 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
22b50 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
22b60 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
22b70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
22b80 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
22b90 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
22ba0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
22bb0 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
22bc0 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   of pExpr->x.pLi
22bd0 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70  st if pExpr->x.p
22be0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20  List->nExpr is. 
22bf0 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20     ** odd.  The 
22c00 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
22c10 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62  al.  If the numb
22c20 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
22c30 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a  n x.pList.    **
22c40 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59   is even, then Y
22c50 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
22c60 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20  the "otherwise" 
22c70 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
22c80 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20      ** Ei is in 
22c90 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
22ca0 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70  i*2] and Ri is p
22cb0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
22cc0 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20  *2+1]..    **.  
22cd0 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
22ce0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
22cf0 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20  n is the Ri for 
22d00 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
22d10 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72  ng Ei,.    ** or
22d20 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
22d30 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65  matching Ei, the
22d40 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72   ELSE term Y, or
22d50 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   if there is.   
22d60 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d   ** no ELSE term
22d70 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  , NULL..    */. 
22d80 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
22d90 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  rt( op==TK_CASE 
22da0 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ); {.      int e
22db0 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22dd0 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
22de0 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
22df0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
22e00 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
22e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
22e20 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
22e30 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
22e40 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
22e50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22e60 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
22e70 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
22e80 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
22e90 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22eb0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
22ec0 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
22ed0 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
22ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
22ef0 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
22f00 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
22f10 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
22f20 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
22f30 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
22f40 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
22f50 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f70 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
22f80 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
22f90 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73  /* The X express
22fc0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
22fd0 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20  r *pTest = 0;   
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ff0 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29  * X==Ei (form A)
23000 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72   or just Ei (for
23010 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56  m B) */.      VV
23020 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63  A_ONLY( int iCac
23030 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  heLevel = pParse
23040 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29  ->iCacheLevel; )
23050 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
23060 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
23070 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
23080 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
23090 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
230a0 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
230b0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
230c0 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
230d0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
230e0 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
230f0 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
23100 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
23110 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
23120 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
23130 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
23140 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
23150 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
23160 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
23170 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a     tempX = *pX;.
23180 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
23190 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
231a0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65  UMN );.        e
231b0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74  xprToRegister(&t
231c0 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65  empX, exprCodeVe
231d0 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65  ctor(pParse, &te
231e0 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  mpX, &regFree1))
231f0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
23200 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
23210 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
23220 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c  t(&opCompare, 0,
23230 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72   sizeof(opCompar
23240 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  e));.        opC
23250 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
23260 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
23270 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65  pare.pLeft = &te
23280 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  mpX;.        pTe
23290 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
232a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  .        /* Tick
232b0 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65  et b351d95f9cd5e
232c0 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63  f17e9d9dbae18f5c
232d0 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20  a8611190001:.   
232e0 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
232f0 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69  e in regFree1 mi
23300 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64  ght get SCopy-ed
23310 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72   into the file r
23320 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
23330 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * So make sure t
23340 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31  hat the regFree1
23350 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
23360 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65   reused for othe
23370 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72  r.        ** pur
23380 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62  poses and possib
23390 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ly overwritten. 
233a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46   */.        regF
233b0 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ree1 = 0;.      
233c0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
233d0 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b   i<nExpr-1; i=i+
233e0 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2){.        sqli
233f0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
23400 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
23410 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20    if( pX ){.    
23420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
23430 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  est!=0 );.      
23440 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52      opCompare.pR
23450 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  ight = aListelem
23460 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
23470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23480 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73      pTest = aLis
23490 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
234a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
234b0 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c    nextCase = sql
234c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
234d0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  l(v);.        te
234e0 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f  stcase( pTest->o
234f0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
23500 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
23510 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
23520 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
23530 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
23540 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
23550 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
23560 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
23570 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
23580 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23590 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
235a0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
235b0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
235c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
235d0 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61  dbeGoto(v, endLa
235e0 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
235f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
23600 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
23610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
23620 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65  solveLabel(v, ne
23630 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  xtCase);.      }
23640 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70  .      if( (nExp
23650 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  r&1)!=0 ){.     
23660 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
23670 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
23680 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23690 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
236a0 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72   pEList->a[nExpr
236b0 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  -1].pExpr, targe
236c0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
236d0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
236e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
236f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
23700 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23710 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
23720 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
23730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
23740 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
23750 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
23760 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20  ->nErr>0 .      
23770 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
23780 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61  iCacheLevel==iCa
23790 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20  cheLevel );.    
237a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
237b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
237c0 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  Label);.      br
237d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
237e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
237f0 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
23800 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
23810 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
23820 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
23830 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20  llback .        
23840 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
23850 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a  inity==OE_Abort.
23860 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
23870 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
23880 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20  E_Fail.         
23890 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
238a0 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a  nity==OE_Ignore.
238b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
238c0 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69  f( !pParse->pTri
238d0 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20  ggerTab ){.     
238e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
238f0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
23920 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
23930 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
23940 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
23950 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
23960 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
23970 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
23980 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
23990 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
239a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
239b0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
239c0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
239d0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
239e0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66  lue) );.      if
239f0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
23a00 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  y==OE_Ignore ){.
23a10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23a20 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
23a30 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c         v, OP_Hal
23a40 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45  t, SQLITE_OK, OE
23a50 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70  _Ignore, 0, pExp
23a60 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a  r->u.zToken,0);.
23a70 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
23a80 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
23a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
23aa0 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
23ab0 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49  int(pParse, SQLI
23ac0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
23ad0 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20  IGGER,.         
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23af0 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
23b00 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  nity, pExpr->u.z
23b10 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  Token, 0, 0);.  
23b20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65      }..      bre
23b30 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
23b40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
23b50 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
23b60 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
23b70 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
23b80 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
23b90 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74  regFree2);.  ret
23ba0 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
23bb0 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74  .** Factor out t
23bc0 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67  he code of the g
23bd0 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
23be0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
23bf0 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n time..**.** If
23c00 20 72 65 67 44 65 73 74 3e 3d 30 20 74 68 65 6e   regDest>=0 then
23c10 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
23c20 6c 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20  lways stored in 
23c30 74 68 61 74 20 72 65 67 69 73 74 65 72 20 61 6e  that register an
23c40 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  d the.** result 
23c50 69 73 20 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e  is not reusable.
23c60 20 20 49 66 20 72 65 67 44 65 73 74 3c 30 20 74    If regDest<0 t
23c70 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
23c80 20 69 73 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20   is free to .** 
23c90 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
23ca0 77 68 65 72 65 65 76 65 72 20 69 74 20 77 61 6e  whereever it wan
23cb0 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 65  ts.  The registe
23cc0 72 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72  r where the expr
23cd0 65 73 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74  ession .** is st
23ce0 6f 72 65 64 20 69 73 20 72 65 74 75 72 6e 65 64  ored is returned
23cf0 2e 20 20 57 68 65 6e 20 72 65 67 44 65 73 74 3c  .  When regDest<
23d00 30 2c 20 74 77 6f 20 69 64 65 6e 74 69 63 61 6c  0, two identical
23d10 20 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69 6c   expressions wil
23d20 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68 65  l.** code to the
23d30 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 0a   same register..
23d40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
23d50 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20  prCodeAtInit(.  
23d60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
23d70 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
23d80 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
23d90 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
23da0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
23db0 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56   code when the V
23dc0 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  DBE initializes 
23dd0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74  */.  int regDest
23de0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
23df0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69  the value in thi
23e00 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
23e10 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a  .  ExprList *p;.
23e20 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46    assert( ConstF
23e30 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
23e40 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
23e50 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69  >pConstExpr;.  i
23e60 66 28 20 72 65 67 44 65 73 74 3c 30 20 26 26 20  f( regDest<0 && 
23e70 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  p ){.    struct 
23e80 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
23e90 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Item;.    int i;
23ea0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
23eb0 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b  ->a, i=p->nExpr;
23ec0 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69   i>0; pItem++, i
23ed0 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  --){.      if( p
23ee0 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26  Item->reusable &
23ef0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
23f00 70 61 72 65 28 30 2c 70 49 74 65 6d 2d 3e 70 45  pare(0,pItem->pE
23f10 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30  xpr,pExpr,-1)==0
23f20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
23f30 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e  rn pItem->u.iCon
23f40 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20  stExprReg;.     
23f50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
23f60 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
23f70 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
23f80 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70  , pExpr, 0);.  p
23f90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
23fa0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
23fb0 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66   p, pExpr);.  if
23fc0 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75  ( p ){.     stru
23fd0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
23fe0 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
23ff0 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  p->nExpr-1];.   
24000 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c    pItem->reusabl
24010 65 20 3d 20 72 65 67 44 65 73 74 3c 30 3b 0a 20  e = regDest<0;. 
24020 20 20 20 20 69 66 28 20 72 65 67 44 65 73 74 3c      if( regDest<
24030 30 20 29 20 72 65 67 44 65 73 74 20 3d 20 2b 2b  0 ) regDest = ++
24040 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
24050 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e     pItem->u.iCon
24060 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44  stExprReg = regD
24070 65 73 74 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  est;.  }.  pPars
24080 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20  e->pConstExpr = 
24090 70 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 44  p;.  return regD
240a0 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  est;.}../*.** Ge
240b0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
240c0 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
240d0 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ssion and store 
240e0 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
240f0 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
24100 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
24110 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72  ster number wher
24120 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
24130 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
24140 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74  ** If the regist
24150 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
24160 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  y register that 
24170 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74  can be deallocat
24180 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  ed,.** then writ
24190 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74  e its number int
241a0 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65  o *pReg.  If the
241b0 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
241c0 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d   is not.** a tem
241d0 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74  porary, then set
241e0 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a   *pReg to zero..
241f0 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
24200 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68  s a constant, th
24210 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
24220 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74  might generate t
24230 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66  his.** code to f
24240 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72  ill the register
24250 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69   in the initiali
24260 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f  zation section o
24270 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72  f the.** VDBE pr
24280 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20  ogram, in order 
24290 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74  to factor it out
242a0 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69   of the evaluati
242b0 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  on loop..*/.int 
242c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
242d0 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  emp(Parse *pPars
242e0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
242f0 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e  int *pReg){.  in
24300 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20  t r2;.  pExpr = 
24310 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
24320 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20  ollate(pExpr);. 
24330 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
24340 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26  Ok(pParse).   &&
24350 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
24360 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71  EGISTER.   && sq
24370 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
24380 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
24390 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 52 65 67  ).  ){.    *pReg
243a0 20 20 3d 20 30 3b 0a 20 20 20 20 72 32 20 3d 20    = 0;.    r2 = 
243b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
243c0 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
243d0 78 70 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73  xpr, -1);.  }els
243e0 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20  e{.    int r1 = 
243f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
24400 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
24410 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
24420 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
24430 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
24440 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
24450 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31        *pReg = r1
24460 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24470 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
24480 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
24490 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65   r1);.      *pRe
244a0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
244b0 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a  .  return r2;.}.
244c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
244d0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
244e0 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
244f0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
24500 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
24510 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
24520 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
24530 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
24540 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
24550 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
24560 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
24570 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
24580 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
24590 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
245a0 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  t){.  int inReg;
245b0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
245c0 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
245d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
245e0 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
245f0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
24600 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c  ISTER ){.    sql
24610 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
24620 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
24630 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54  _Copy, pExpr->iT
24640 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
24650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65   }else{.    inRe
24660 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
24670 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
24680 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
24690 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
246a0 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c  arse->pVdbe!=0 |
246b0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
246c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
246d0 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
246e0 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
246f0 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Vdbe ){.      sq
24700 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24710 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
24720 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
24730 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20  target);.    }. 
24740 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
24750 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70   a transient cop
24760 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
24770 70 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63  pExpr and then c
24780 6f 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20  ode it using.** 
24790 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
247a0 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
247b0 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
247c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
247d0 28 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61  ().** except tha
247e0 74 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72  t the input expr
247f0 65 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e  ession is guaran
24800 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61  teed to be uncha
24810 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
24820 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
24830 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
24840 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
24850 74 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c  t target){.  sql
24860 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
24870 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d  e->db;.  pExpr =
24880 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
24890 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
248a0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
248b0 46 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33  Failed ) sqlite3
248c0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
248d0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
248e0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
248f0 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
24900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
24910 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
24920 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
24930 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
24940 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
24950 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
24960 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
24970 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
24980 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
24990 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
249a0 72 67 65 74 2e 20 20 49 66 20 74 68 65 20 65 78  rget.  If the ex
249b0 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
249c0 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  tant, then this 
249d0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74  routine.** might
249e0 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20   choose to code 
249f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
24a00 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  t initialization
24a10 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   time..*/.void s
24a20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61  qlite3ExprCodeFa
24a30 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a  ctorable(Parse *
24a40 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
24a50 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
24a60 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
24a70 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26  okConstFactor &&
24a80 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
24a90 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b  nstant(pExpr) ){
24aa0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
24ab0 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
24ac0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
24ad0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24ae0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
24af0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
24b00 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  arget);.  }.}../
24b10 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24b20 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74 65  de that evaluate
24b30 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
24b40 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
24b50 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
24b60 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
24b70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
24b80 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
24b90 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
24ba0 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
24bb0 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
24bc0 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
24bd0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
24be0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
24bf0 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
24c00 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
24c10 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
24c20 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
24c30 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
24c40 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
24c50 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
24c60 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
24c70 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
24c80 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
24c90 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
24ca0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
24cb0 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
24cc0 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f  re reused..*/.vo
24cd0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
24ce0 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
24cf0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
24d00 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
24d10 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
24d20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
24d30 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73   int iMem;..  as
24d40 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
24d50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
24d60 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
24d70 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ER );.  sqlite3E
24d80 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
24d90 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
24da0 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
24db0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
24dc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24dd0 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c  OP_Copy, target,
24de0 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f   iMem);.  exprTo
24df0 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20  Register(pExpr, 
24e00 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iMem);.}../*.** 
24e10 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
24e20 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
24e30 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
24e40 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
24e50 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
24e60 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
24e70 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
24e80 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
24e90 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
24ea0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
24eb0 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
24ec0 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65  ated.  The numbe
24ed0 72 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 0a  r returned will.
24ee0 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65 20 70 4c  ** usually be pL
24ef0 69 73 74 2d 3e 6e 45 78 70 72 20 62 75 74 20 6d  ist->nExpr but m
24f00 69 67 68 74 20 62 65 20 72 65 64 75 63 65 64 20  ight be reduced 
24f10 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f  if SQLITE_ECEL_O
24f20 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20 64 65 66  MITREF.** is def
24f30 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ined..**.** The 
24f40 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20  SQLITE_ECEL_DUP 
24f50 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68  flag prevents th
24f60 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  e arguments from
24f70 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64   being.** filled
24f80 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e   using OP_SCopy.
24f90 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62    OP_Copy must b
24fa0 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  e used instead..
24fb0 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
24fc0 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67  _ECEL_FACTOR arg
24fd0 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e  ument allows con
24fe0 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  stant arguments 
24ff0 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65  to be.** factore
25000 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69  d out into initi
25010 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  alization code..
25020 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
25030 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d  _ECEL_REF flag m
25040 65 61 6e 73 20 74 68 61 74 20 65 78 70 72 65 73  eans that expres
25050 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73  sions in the lis
25060 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69  t with.** ExprLi
25070 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65  st.a[].u.x.iOrde
25080 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c  rByCol>0 have al
25090 72 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75  ready been evalu
250a0 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a  ated and stored.
250b0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  ** in registers 
250c0 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73  at srcReg, and s
250d0 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20  o the value can 
250e0 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  be copied from t
250f0 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51 4c 49  here..** If SQLI
25100 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20  TE_ECEL_OMITREF 
25110 69 73 20 61 6c 73 6f 20 73 65 74 2c 20 74 68 65  is also set, the
25120 6e 20 74 68 65 20 76 61 6c 75 65 73 20 77 69 74  n the values wit
25130 68 20 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  h u.x.iOrderByCo
25140 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d 70 6c  l>0.** are simpl
25150 79 20 6f 6d 69 74 74 65 64 20 72 61 74 68 65 72  y omitted rather
25160 20 74 68 61 6e 20 62 65 69 6e 67 20 63 6f 70 69   than being copi
25170 65 64 20 66 72 6f 6d 20 73 72 63 52 65 67 2e 0a  ed from srcReg..
25180 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
25190 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
251a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
251b0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
251c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
251d0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
251e0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
251f0 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
25200 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67  ed */.  int targ
25210 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68  et,        /* Wh
25220 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73  ere to write res
25230 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72  ults */.  int sr
25240 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  cReg,        /* 
25250 53 6f 75 72 63 65 20 72 65 67 69 73 74 65 72 73  Source registers
25260 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   if SQLITE_ECEL_
25270 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67  REF */.  u8 flag
25280 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  s           /* S
25290 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61  QLITE_ECEL_* fla
252a0 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  gs */.){.  struc
252b0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
252c0 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
252d0 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79   j, n;.  u8 copy
252e0 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  Op = (flags & SQ
252f0 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f  LITE_ECEL_DUP) ?
25300 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43   OP_Copy : OP_SC
25310 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  opy;.  Vdbe *v =
25320 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
25330 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
25340 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
25350 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
25360 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
25370 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65  dbe!=0 );  /* Ne
25380 76 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61  ver gets this fa
25390 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20  r otherwise */. 
253a0 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   n = pList->nExp
253b0 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46  r;.  if( !ConstF
253c0 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
253d0 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ) flags &= ~SQLI
253e0 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a  TE_ECEL_FACTOR;.
253f0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
25400 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20  t->a, i=0; i<n; 
25410 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
25420 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
25430 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
25440 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
25450 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
25460 21 3d 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65  !=0 && (j = pIte
25470 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
25480 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ol)>0 ){.      i
25490 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
254a0 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29  E_ECEL_OMITREF )
254b0 7b 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20  {.        i--;. 
254c0 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20         n--;.    
254d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
254e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
254f0 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b  p2(v, copyOp, j+
25500 73 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74  srcReg-1, target
25510 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
25520 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
25530 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
25540 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71  FACTOR)!=0 && sq
25550 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
25560 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
25570 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25580 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
25590 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
255a0 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
255b0 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d       int inReg =
255c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
255d0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
255e0 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
255f0 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
25600 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20  !=target+i ){.  
25610 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
25620 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  p;.        if( c
25630 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20  opyOp==OP_Copy. 
25640 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d          && (pOp=
25650 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
25660 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65  (v, -1))->opcode
25670 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
25680 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f     && pOp->p1+pO
25690 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20  p->p3+1==inReg. 
256a0 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
256b0 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61  p2+pOp->p3+1==ta
256c0 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29  rget+i.        )
256d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
256e0 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  >p3++;.        }
256f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25700 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25710 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52  2(v, copyOp, inR
25720 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  eg, target+i);. 
25730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
25740 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
25750 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
25760 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
25770 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72  r a BETWEEN oper
25780 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78  ator..**.**    x
25790 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
257a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
257b0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
257c0 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79  o .**.**    x>=y
257d0 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20   AND x<=z.**.** 
257e0 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c  Code it as such,
257f0 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
25800 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75  do the common su
25810 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65  bexpression.** e
25820 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e  limination of x.
25830 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70  .**.** The xJump
25840 49 66 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  If parameter det
25850 65 72 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a  ermines details:
25860 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20  .**.**    NULL: 
25870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25880 20 20 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c    Store the bool
25890 65 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65  ean result in re
258a0 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71  g[dest].**    sq
258b0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 3a  lite3ExprIfTrue:
258c0 20 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65        Jump to de
258d0 73 74 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20  st if true.**   
258e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
258f0 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f  lse:     Jump to
25900 20 64 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a   dest if false.*
25910 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e  *.** The jumpIfN
25920 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73  ull parameter is
25930 20 69 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d   ignored if xJum
25940 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  pIf is NULL..*/.
25950 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
25960 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50  CodeBetween(.  P
25970 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
25980 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
25990 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
259a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
259b0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
259c0 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78  * The BETWEEN ex
259d0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
259e0 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
259f0 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
25a00 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c  ion or storage l
25a10 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  ocation */.  voi
25a20 64 20 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65  d (*xJump)(Parse
25a30 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29  *,Expr*,int,int)
25a40 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74  , /* Action to t
25a50 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  ake */.  int jum
25a60 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61  pIfNull    /* Ta
25a70 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
25a80 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55  he BETWEEN is NU
25a90 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65  LL */.){. Expr e
25aa0 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54  xprAnd;     /* T
25ab0 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
25ac0 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d  in  x>=y AND x<=
25ad0 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  z  */.  Expr com
25ae0 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65  pLeft;    /* The
25af0 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a    x>=y  term */.
25b00 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
25b10 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a  ;   /* The  x<=z
25b20 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
25b30 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a   exprX;       /*
25b40 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72   The  x  subexpr
25b50 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
25b60 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a  regFree1 = 0; /*
25b70 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
25b80 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d  egister */...  m
25b90 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c  emset(&compLeft,
25ba0 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
25bb0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d  );.  memset(&com
25bc0 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f  pRight, 0, sizeo
25bd0 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73  f(Expr));.  mems
25be0 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20  et(&exprAnd, 0, 
25bf0 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a  sizeof(Expr));..
25c00 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
25c10 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
25c20 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
25c30 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45  );.  exprX = *pE
25c40 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78  xpr->pLeft;.  ex
25c50 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
25c60 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65  D;.  exprAnd.pLe
25c70 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a  ft = &compLeft;.
25c80 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74    exprAnd.pRight
25c90 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20   = &compRight;. 
25ca0 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
25cb0 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  K_GE;.  compLeft
25cc0 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
25cd0 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67  .  compLeft.pRig
25ce0 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
25cf0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
25d00 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20  .  compRight.op 
25d10 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52  = TK_LE;.  compR
25d20 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  ight.pLeft = &ex
25d30 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  prX;.  compRight
25d40 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
25d50 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
25d60 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65  Expr;.  exprToRe
25d70 67 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 65  gister(&exprX, e
25d80 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
25d90 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
25da0 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28  egFree1));.  if(
25db0 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a   xJump ){.    xJ
25dc0 75 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  ump(pParse, &exp
25dd0 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70  rAnd, dest, jump
25de0 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  IfNull);.  }else
25df0 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68  {.    /* Mark th
25e00 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
25e10 62 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f  being from the O
25e20 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
25e30 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20  e of a join.    
25e40 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  ** so that the s
25e50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
25e60 72 67 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77  rget() routine w
25e70 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
25e80 74 6f 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69  to move.    ** i
25e90 74 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65  t into the Parse
25ea0 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74  .pConstExpr list
25eb0 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65  .  We should use
25ec0 20 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74   a new bit for t
25ed0 68 69 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  his,.    ** for 
25ee0 63 6c 61 72 69 74 79 2c 20 62 75 74 20 77 65 20  clarity, but we 
25ef0 61 72 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20  are out of bits 
25f00 69 6e 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67  in the Expr.flag
25f10 73 20 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20  s field so we.  
25f20 20 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75    ** have to reu
25f30 73 65 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  se the EP_FromJo
25f40 69 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e  in bit.  Bummer.
25f50 20 2a 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c   */.    exprX.fl
25f60 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f  ags |= EP_FromJo
25f70 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  in;.    sqlite3E
25f80 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
25f90 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
25fa0 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dest);.  }.  sql
25fb0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
25fc0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
25fd0 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75  ee1);..  /* Ensu
25fe0 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74  re adequate test
25ff0 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74   coverage */.  t
26000 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
26010 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
26020 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
26030 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
26040 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
26050 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
26060 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
26070 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
26080 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
26090 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
260a0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
260b0 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
260c0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
260d0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
260e0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
260f0 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
26100 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
26110 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
26120 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26130 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26140 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
26150 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
26160 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
26170 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26180 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
26190 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
261a0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
261b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
261c0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
261d0 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
261e0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
261f0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
26200 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26210 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26220 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
26230 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
26240 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26250 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a   xJump==0 );.}..
26260 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
26270 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
26280 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
26290 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
262a0 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
262b0 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
262c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
262d0 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
262e0 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
262f0 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
26300 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
26310 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
26320 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
26330 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
26340 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
26350 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
26360 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
26370 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
26380 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
26390 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
263a0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  L..**.** This co
263b0 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
263c0 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
263d0 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
263e0 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
263f0 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
26400 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
26410 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
26420 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
26430 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
26440 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
26450 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
26460 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
26470 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
26480 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
26490 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
264a0 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
264b0 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
264c0 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
264d0 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
264e0 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
264f0 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
26500 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
26510 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
26520 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
26530 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
26540 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
26550 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
26560 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
26570 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
26580 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
26590 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
265a0 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
265b0 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
265c0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
265d0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
265e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
265f0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
26600 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e  =0) )     return
26610 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  ;  /* Existence 
26620 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
26630 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
26640 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
26650 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
26660 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e   No way this can
26670 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20   happen */.  op 
26680 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
26690 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
266a0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
266b0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
266c0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
266d0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
266e0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
266f0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
26700 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26710 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
26720 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49  >pLeft, d2,jumpI
26730 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
26740 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
26750 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
26760 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
26770 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26780 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26790 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
267a0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
267b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
267c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
267d0 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
267e0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
267f0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
26800 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26810 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
26820 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26830 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26840 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26850 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
26860 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
26870 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26880 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26890 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
268a0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
268b0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
268c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
268d0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
268e0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
268f0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
26900 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
26910 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26920 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
26930 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26940 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26950 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26960 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
26970 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
26980 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
26990 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
269a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
269b0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
269c0 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
269d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
269e0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
269f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
26a00 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
26a10 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
26a20 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
26a30 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
26a40 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
26a50 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
26a60 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
26a70 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
26a80 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
26a90 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
26aa0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
26ab0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
26ac0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _EQ: {.      if(
26ad0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
26ae0 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  ctor(pExpr->pLef
26af0 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c  t) ) goto defaul
26b00 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65  t_expr;.      te
26b10 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26b20 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
26b30 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
26b40 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
26b50 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
26b60 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
26b70 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
26b80 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
26b90 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
26ba0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
26bb0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
26bc0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26bd0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
26be0 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
26bf0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
26c00 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26c10 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
26c20 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
26c30 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26c40 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
26c50 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
26c60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26c70 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
26c80 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
26c90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
26ca0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
26cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
26cc0 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
26cd0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
26ce0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
26cf0 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
26d00 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
26d10 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
26d20 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
26d30 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26d40 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
26d50 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
26d60 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
26d70 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
26d80 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
26d90 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
26da0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
26db0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
26dc0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
26dd0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
26de0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
26df0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
26e00 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
26e10 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
26e20 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
26e30 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
26e40 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
26e50 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
26e60 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
26e70 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
26e80 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
26e90 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
26ea0 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
26eb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26ec0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
26ed0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26ee0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
26ef0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26f00 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
26f10 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
26f20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
26f30 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
26f40 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
26f50 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
26f60 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
26f70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
26f80 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
26f90 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
26fa0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
26fb0 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
26fc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
26fd0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
26fe0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
26ff0 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
27000 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27010 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
27020 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27030 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
27040 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
27050 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27060 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
27070 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27080 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
27090 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
270a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
270b0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
270c0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
270d0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
270e0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
270f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
27100 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
27110 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e  rIfTrue, jumpIfN
27120 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
27130 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
27140 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
27150 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
27160 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
27170 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
27180 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
27190 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
271a0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
271b0 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73  jumpIfNull ? des
271c0 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b  t : destIfFalse;
271d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
271e0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
271f0 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
27200 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
27210 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27220 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
27230 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27240 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
27250 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
27260 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27270 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
27280 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65  efault: {.    de
27290 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20  fault_expr:.    
272a0 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
272b0 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
272c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
272d0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
272e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
272f0 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
27300 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
27310 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20     /* No-op */. 
27320 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27330 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
27340 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
27350 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
27360 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
27370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27380 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
27390 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
273a0 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  !=0);.        Vd
273b0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
273c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
273d0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
273e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
273f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
27400 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27410 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27420 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
27430 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
27440 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
27450 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
27460 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
27470 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a  Free2);  .}../*.
27480 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
27490 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
274a0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
274b0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
274c0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
274d0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
274e0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
274f0 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
27500 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
27510 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
27520 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
27530 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
27540 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
27550 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
27560 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
27570 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
27580 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
27590 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45  IfNull is SQLITE
275a0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66  _JUMPIFNULL or f
275b0 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
275c0 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20  umpIfNull.** is 
275d0 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
275e0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
275f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
27600 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
27610 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
27620 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
27630 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
27640 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
27650 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
27660 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
27670 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
27680 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
27690 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
276a0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
276b0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
276c0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
276d0 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  0) ) return; /* 
276e0 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
276f0 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
27700 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ler */.  if( pEx
27710 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72  pr==0 )    retur
27720 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
27730 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
27740 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
27750 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
27760 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
27770 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
27780 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
27790 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
277a0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
277b0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
277c0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
277d0 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
277e0 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
277f0 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
27800 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
27810 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
27820 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
27830 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
27840 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
27850 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
27860 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
27870 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
27880 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
27890 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
278a0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
278b0 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
278c0 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
278d0 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
278e0 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
278f0 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
27900 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
27910 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
27920 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
27930 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
27940 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
27950 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
27960 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
27970 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
27980 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
27990 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
279a0 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
279b0 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
279c0 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
279d0 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
279e0 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
279f0 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
27a00 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
27a10 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
27a20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
27a30 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
27a40 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
27a50 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
27a60 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
27a70 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
27a80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
27a90 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
27aa0 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
27ab0 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
27ac0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27ad0 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
27ae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27af0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
27b00 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
27b10 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27b20 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
27b30 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
27b40 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
27b50 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
27b60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
27b70 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
27b80 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
27b90 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
27ba0 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
27bb0 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
27bc0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
27bd0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
27be0 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  D: {.      testc
27bf0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
27c00 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
27c10 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
27c20 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27c30 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
27c40 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
27c50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
27c60 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
27c70 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
27c80 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
27c90 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
27ca0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27cb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27cc0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
27cd0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
27ce0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
27cf0 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
27d00 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
27d10 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
27d20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
27d30 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
27d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27d50 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
27d60 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
27d70 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
27d80 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
27d90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27da0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
27db0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
27dc0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
27dd0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
27de0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
27df0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
27e00 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
27e10 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
27e20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27e30 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
27e40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27e50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27e60 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
27e70 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
27e80 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
27e90 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
27ea0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27eb0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
27ec0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
27ed0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27ee0 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
27ef0 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
27f00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
27f10 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
27f20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27f30 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
27f40 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
27f50 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d  op = (pExpr->op=
27f60 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20  =TK_IS) ? TK_NE 
27f70 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a  : TK_EQ;.      j
27f80 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49  umpIfNull = SQLI
27f90 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
27fa0 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
27fb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
27fc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
27fd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
27fe0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
27ff0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
28000 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
28010 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
28020 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
28030 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
28040 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78   goto default_ex
28050 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pr;.      testca
28060 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
28070 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
28080 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
28090 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
280a0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
280b0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
280c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
280d0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
280e0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
280f0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
28100 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
28110 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28120 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
28130 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
28140 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
28150 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
28160 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
28170 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
28180 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
28190 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
281a0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
281b0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
281c0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
281d0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
281e0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
281f0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
28200 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
28210 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
28220 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
28230 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
28240 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
28250 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
28260 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
28270 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
28280 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
28290 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
282a0 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
282b0 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
282c0 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56  =OP_Eq);.      V
282d0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
282e0 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
282f0 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
28300 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
28310 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
28320 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
28330 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
28340 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
28350 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
28360 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
28370 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
28380 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
28390 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
283a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
283b0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
283c0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
283d0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
283e0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
283f0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
28400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
28410 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
28420 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
28430 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
28440 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
28450 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
28460 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
28470 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
28480 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
28490 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
284a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
284b0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
284c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
284d0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
284e0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
284f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
28500 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65  LL );   VdbeCove
28510 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
28520 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
28530 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
28540 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62  _NOTNULL );  Vdb
28550 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
28560 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
28570 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28580 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
28590 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
285a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
285b0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
285c0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
285d0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
285e0 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
285f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
28600 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
28610 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e  IfFalse, jumpIfN
28620 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
28630 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
28640 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
28650 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
28660 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
28670 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
28680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28690 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
286a0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
286b0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
286c0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
286d0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
286e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
286f0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
28700 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
28710 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
28720 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  st, destIfNull);
28730 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28740 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
28750 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
28760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
28770 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
28780 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
28790 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78  {.    default_ex
287a0 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65  pr: .      if( e
287b0 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
287c0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
287d0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
287e0 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
287f0 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
28800 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
28810 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e   ){.        /* n
28820 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
28830 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
28840 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
28850 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
28860 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
28870 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28880 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
28890 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74  _IfNot, r1, dest
288a0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
288b0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
288c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
288d0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
288e0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
288f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
28900 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
28910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
28920 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
28930 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
28940 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
28950 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
28960 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
28970 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
28980 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b  2);.}../*.** Lik
28990 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  e sqlite3ExprIfF
289a0 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68  alse() except th
289b0 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64  at a copy is mad
289c0 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72  e of pExpr befor
289d0 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61  e.** code genera
289e0 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63  tion, and that c
289f0 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61  opy is deleted a
28a00 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61  fter code genera
28a10 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e  tion. This.** en
28a20 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f  sures that the o
28a30 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73  riginal pExpr is
28a40 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76   unchanged..*/.v
28a50 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
28a60 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20  fFalseDup(Parse 
28a70 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
28a80 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69  Expr, int dest,i
28a90 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
28aa0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
28ab0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
28ac0 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69  pr *pCopy = sqli
28ad0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
28ae0 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
28af0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
28b00 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
28b10 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
28b20 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73  arse, pCopy, des
28b30 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
28b40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
28b50 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70  rDelete(db, pCop
28b60 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70  y);.}../*.** Exp
28b70 72 65 73 73 69 6f 6e 20 70 56 61 72 20 69 73 20  ression pVar is 
28b80 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
28b90 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65   an SQL variable
28ba0 2e 20 70 45 78 70 72 20 6d 61 79 20 62 65 20 61  . pExpr may be a
28bb0 6e 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65 78  ny.** type of ex
28bc0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
28bd0 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69  If pExpr is a si
28be0 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 2d  mple SQL value -
28bf0 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 61   an integer, rea
28c00 6c 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62 0a  l, string, blob.
28c10 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65  ** or NULL value
28c20 20 2d 20 74 68 65 6e 20 74 68 65 20 56 44 42 45   - then the VDBE
28c30 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
28c40 20 70 72 65 70 61 72 65 64 20 69 73 20 63 6f 6e   prepared is con
28c50 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72 65  figured.** to re
28c60 2d 70 72 65 70 61 72 65 20 65 61 63 68 20 74 69  -prepare each ti
28c70 6d 65 20 61 20 6e 65 77 20 76 61 6c 75 65 20 69  me a new value i
28c80 73 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61  s bound to varia
28c90 62 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20  ble pVar..**.** 
28ca0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66  Additionally, if
28cb0 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d 70   pExpr is a simp
28cc0 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 61 6e 64  le SQL value and
28cd0 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 68   the value is th
28ce0 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68 61  e.** same as tha
28cf0 74 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75 6e  t currently boun
28d00 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56  d to variable pV
28d10 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  ar, non-zero is 
28d20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68  returned..** Oth
28d30 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 76  erwise, if the v
28d40 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 74 68  alues are not th
28d50 65 20 73 61 6d 65 20 6f 72 20 69 66 20 70 45 78  e same or if pEx
28d60 70 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70  pr is not a simp
28d70 6c 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65 2c  le.** SQL value,
28d80 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   zero is returne
28d90 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
28da0 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69   exprCompareVari
28db0 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
28dc0 73 65 2c 20 45 78 70 72 20 2a 70 56 61 72 2c 20  se, Expr *pVar, 
28dd0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
28de0 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69  int res = 0;.  i
28df0 6e 74 20 69 56 61 72 3b 0a 20 20 73 71 6c 69 74  nt iVar;.  sqlit
28e00 65 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a 70  e3_value *pL, *p
28e10 52 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c 69  R = 0;.  .  sqli
28e20 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  te3ValueFromExpr
28e30 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
28e40 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  pr, SQLITE_UTF8,
28e50 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
28e60 2c 20 26 70 52 29 3b 0a 20 20 69 66 28 20 70 52  , &pR);.  if( pR
28e70 20 29 7b 0a 20 20 20 20 69 56 61 72 20 3d 20 70   ){.    iVar = p
28e80 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  Var->iColumn;.  
28e90 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
28ea0 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
28eb0 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20  pVdbe, iVar);.  
28ec0 20 20 70 4c 20 3d 20 73 71 6c 69 74 65 33 56 64    pL = sqlite3Vd
28ed0 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
28ee0 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
28ef0 72 65 2c 20 69 56 61 72 2c 20 53 51 4c 49 54 45  re, iVar, SQLITE
28f00 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20  _AFF_BLOB);.    
28f10 69 66 28 20 70 4c 20 29 7b 0a 20 20 20 20 20 20  if( pL ){.      
28f20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
28f30 65 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c 49  e_type(pL)==SQLI
28f40 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
28f50 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
28f60 5f 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d 61  _text(pL); /* Ma
28f70 6b 65 20 73 75 72 65 20 74 68 65 20 65 6e 63 6f  ke sure the enco
28f80 64 69 6e 67 20 69 73 20 55 54 46 2d 38 20 2a 2f  ding is UTF-8 */
28f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
28fa0 65 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65 33  es =  0==sqlite3
28fb0 4d 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20 70  MemCompare(pL, p
28fc0 52 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  R, 0);.    }.   
28fd0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
28fe0 65 28 70 52 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(pR);.    sqlit
28ff0 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 29 3b  e3ValueFree(pL);
29000 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
29010 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  es;.}../*.** Do 
29020 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
29030 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
29040 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
29050 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a  rn 0 if the two.
29060 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
29070 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64  re completely id
29080 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e  entical.  Return
29090 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65   1 if they diffe
290a0 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43  r only.** by a C
290b0 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
290c0 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c  at the top level
290d0 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74  .  Return 2 if t
290e0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
290f0 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68  nces.** other th
29100 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  an the top-level
29110 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
29120 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  r..**.** If any 
29130 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
29140 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
29150 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
29160 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
29170 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
29180 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
29190 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
291a0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
291b0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Tab..**.** The p
291c0 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20  A side might be 
291d0 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
291e0 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  R.  If that is t
291f0 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69  he case and pB i
29200 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54  s.** not using T
29210 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69  K_REGISTER but i
29220 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69  s otherwise equi
29230 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69  valent, then sti
29240 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ll return 0..**.
29250 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
29260 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
29270 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20  eturn 2 even if 
29280 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69  the two expressi
29290 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72  ons.** really ar
292a0 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49  e equivalent.  I
292b0 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76  f we cannot prov
292c0 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
292d0 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64  ssions are.** id
292e0 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75  entical, we retu
292f0 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20  rn 2 just to be 
29300 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69  safe.  So if thi
29310 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
29320 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75  urns 2, then you
29330 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b   do not really k
29340 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20  now for certain 
29350 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
29360 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
29370 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20  e same.  But if 
29380 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31  you get a 0 or 1
29390 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f   return, then yo
293a0 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65  u.** can be sure
293b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
293c0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
293d0 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68  In the places wh
293e0 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ere.** this rout
293f0 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20  ine is used, it 
29400 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f  does not hurt to
29410 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20   get an extra 2 
29420 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
29430 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
29440 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
29450 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
29460 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
29470 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20  ncorrect 0 or 1 
29480 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
29490 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  malfunction..**.
294a0 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
294b0 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54 4b  not NULL then TK
294c0 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 73 20  _VARIABLE terms 
294d0 69 6e 20 70 41 20 77 69 74 68 20 62 69 6e 64 69  in pA with bindi
294e0 6e 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  ngs in.** pParse
294f0 2d 3e 70 52 65 70 72 65 70 61 72 65 20 63 61 6e  ->pReprepare can
29500 20 62 65 20 6d 61 74 63 68 65 64 20 61 67 61 69   be matched agai
29510 6e 73 74 20 6c 69 74 65 72 61 6c 73 20 69 6e 20  nst literals in 
29520 70 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50 61  pB.  The .** pPa
29530 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d  rse->pVdbe->expm
29540 61 73 6b 20 62 69 74 6d 61 73 6b 20 69 73 20 75  ask bitmask is u
29550 70 64 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  pdated for each 
29560 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e  variable referen
29570 63 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72 73  ced..** If pPars
29580 65 20 69 73 20 4e 55 4c 4c 20 28 74 68 65 20 6e  e is NULL (the n
29590 6f 72 6d 61 6c 20 63 61 73 65 29 20 74 68 65 6e  ormal case) then
295a0 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c 45   any TK_VARIABLE
295b0 20 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72 67   term in .** Arg
295c0 75 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68 6f  ument pParse sho
295d0 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
295e0 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e  NULL. If it is n
295f0 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20 6f  ot NULL and pA o
29600 72 0a 2a 2a 20 70 42 20 63 61 75 73 65 73 20 61  r.** pB causes a
29610 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
29620 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   2..*/.int sqlit
29630 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 50 61  e3ExprCompare(Pa
29640 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
29650 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c  r *pA, Expr *pB,
29660 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33   int iTab){.  u3
29670 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b  2 combinedFlags;
29680 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
29690 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
296a0 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a  urn pB==pA ? 0 :
296b0 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   2;.  }.  if( pP
296c0 61 72 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d 3d  arse && pA->op==
296d0 54 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20 65  TK_VARIABLE && e
296e0 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62  xprCompareVariab
296f0 6c 65 28 70 50 61 72 73 65 2c 20 70 41 2c 20 70  le(pParse, pA, p
29700 42 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  B) ){.    return
29710 20 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e   0;.  }.  combin
29720 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c  edFlags = pA->fl
29730 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b  ags | pB->flags;
29740 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46  .  if( combinedF
29750 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
29760 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ue ){.    if( (p
29770 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61  A->flags&pB->fla
29780 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21  gs&EP_IntValue)!
29790 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c  =0 && pA->u.iVal
297a0 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65  ue==pB->u.iValue
297b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
297c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   0;.    }.    re
297d0 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
297e0 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
297f0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
29800 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
29810 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
29820 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d  pare(pParse, pA-
29830 3e 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c  >pLeft,pB,iTab)<
29840 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
29850 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
29860 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pB->op==TK_CO
29870 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
29880 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
29890 73 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74  se, pA,pB->pLeft
298a0 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
298b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
298c0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
298d0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
298e0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
298f0 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  A->op!=TK_AGG_CO
29900 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54  LUMN && pA->u.zT
29910 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
29920 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pA->op==TK_FUNCT
29930 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ION ){.      if(
29940 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
29950 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
29960 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20  >u.zToken)!=0 ) 
29970 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65  return 2;.    }e
29980 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 70  lse if( strcmp(p
29990 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
299a0 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a  u.zToken)!=0 ){.
299b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d        return pA-
299c0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
299d0 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20  ? 1 : 2;.    }. 
299e0 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c   }.  if( (pA->fl
299f0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
29a00 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
29a10 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
29a20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
29a30 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64  ALWAYS((combined
29a40 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e  Flags & EP_Token
29a50 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20  Only)==0) ){.   
29a60 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
29a70 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
29a80 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  t ) return 2;.  
29a90 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
29aa0 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
29ab0 20 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e   pA->pLeft, pB->
29ac0 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72  pLeft, iTab) ) r
29ad0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
29ae0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29af0 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e  are(pParse, pA->
29b00 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
29b10 68 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  ht, iTab) ) retu
29b20 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
29b30 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
29b40 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74  pare(pA->x.pList
29b50 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  , pB->x.pList, i
29b60 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
29b70 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28  .    if( ALWAYS(
29b80 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
29b90 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29   EP_Reduced)==0)
29ba0 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53   && pA->op!=TK_S
29bb0 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69  TRING ){.      i
29bc0 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  f( pA->iColumn!=
29bd0 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65  pB->iColumn ) re
29be0 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66  turn 2;.      if
29bf0 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
29c00 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20  ->iTable .      
29c10 20 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21   && (pA->iTable!
29c20 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70  =iTab || NEVER(p
29c30 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29  B->iTable>=0)) )
29c40 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
29c50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
29c60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
29c70 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f  e two ExprList o
29c80 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20  bjects.  Return 
29c90 30 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  0 if they are id
29ca0 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20  entical and .** 
29cb0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79  non-zero if they
29cc0 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
29cd0 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ay..**.** If any
29ce0 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
29cf0 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
29d00 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
29d10 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
29d20 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
29d30 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
29d40 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
29d50 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
29d60 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  iTab..**.** This
29d70 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72   routine might r
29d80 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66  eturn non-zero f
29d90 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78  or equivalent Ex
29da0 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a  prLists.  The.**
29db0 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63   only consequenc
29dc0 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c  e will be disabl
29dd0 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ed optimizations
29de0 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74  .  But this rout
29df0 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65  ine.** must neve
29e00 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68  r return 0 if th
29e10 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f  e two ExprList o
29e20 62 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65  bjects are diffe
29e30 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61  rent, or.** a ma
29e40 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72  lfunction will r
29e50 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  esult..**.** Two
29e60 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61   NULL pointers a
29e70 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
29e80 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42   be the same.  B
29e90 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ut a NULL pointe
29ea0 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66  r.** always diff
29eb0 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e  ers from a non-N
29ec0 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
29ed0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c  int sqlite3ExprL
29ee0 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c  istCompare(ExprL
29ef0 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73  ist *pA, ExprLis
29f00 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  t *pB, int iTab)
29f10 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
29f20 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20   pA==0 && pB==0 
29f30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
29f40 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
29f50 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
29f60 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42  f( pA->nExpr!=pB
29f70 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e  ->nExpr ) return
29f80 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   1;.  for(i=0; i
29f90 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  <pA->nExpr; i++)
29fa0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
29fb0 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45  rA = pA->a[i].pE
29fc0 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
29fd0 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d  ExprB = pB->a[i]
29fe0 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
29ff0 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pA->a[i].sortOrd
2a000 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72  er!=pB->a[i].sor
2a010 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20  tOrder ) return 
2a020 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  1;.    if( sqlit
2a030 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
2a040 20 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c   pExprA, pExprB,
2a050 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
2a060 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2a070 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65  0;.}../*.** Like
2a080 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2a090 61 72 65 28 29 20 65 78 63 65 70 74 20 43 4f 4c  are() except COL
2a0a0 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61  LATE operators a
2a0b0 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 0a  t the top-level.
2a0c0 2a 2a 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  ** are ignored..
2a0d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2a0e0 70 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 45 78  prCompareSkip(Ex
2a0f0 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
2a100 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 72  , int iTab){.  r
2a110 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
2a120 72 43 6f 6d 70 61 72 65 28 30 2c 0a 20 20 20 20  rCompare(0,.    
2a130 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2a140 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2a150 70 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pA),.           
2a160 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69    sqlite3ExprSki
2a170 70 43 6f 6c 6c 61 74 65 28 70 42 29 2c 0a 20 20  pCollate(pB),.  
2a180 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 29             iTab)
2a190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2a1a0 6e 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e  n true if we can
2a1b0 20 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77   prove the pE2 w
2a1c0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72  ill always be tr
2a1d0 75 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20  ue if pE1 is.** 
2a1e0 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61  true.  Return fa
2a1f0 6c 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  lse if we cannot
2a200 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72   complete the pr
2a210 6f 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69  oof or if pE2 mi
2a220 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e  ght.** be false.
2a230 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
2a240 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20  *     pE1: x==5 
2a250 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
2a260 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
2a270 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
2a280 70 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20  pE1: x>0        
2a290 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
2a2a0 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61        Result: fa
2a2b0 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
2a2c0 78 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20  x=21       pE2: 
2a2d0 78 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20  x=21 OR y=43    
2a2e0 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
2a2f0 20 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33       pE1: x!=123
2a300 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
2a310 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
2a320 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
2a330 45 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70  E1: x!=?1      p
2a340 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
2a350 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
2a360 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
2a370 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20  IS NULL  pE2: x 
2a380 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2a390 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
2a3a0 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32      pE1: x IS ?2
2a3b0 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
2a3c0 54 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74  T NULL    Reuslt
2a3d0 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68  : false.**.** Wh
2a3e0 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f  en comparing TK_
2a3f0 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74  COLUMN nodes bet
2a400 77 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32  ween pE1 and pE2
2a410 2c 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20  , if pE2 has.** 
2a420 45 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68  Expr.iTable<0 th
2a430 65 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c  en assume a tabl
2a440 65 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62  e number given b
2a450 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66  y iTab..**.** If
2a460 20 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e   pParse is not N
2a470 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ULL, then the va
2a480 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 76 61  lues of bound va
2a490 72 69 61 62 6c 65 73 20 69 6e 20 70 45 31 20 61  riables in pE1 a
2a4a0 72 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 65 64 20  re .** compared 
2a4b0 61 67 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 20  against literal 
2a4c0 76 61 6c 75 65 73 20 69 6e 20 70 45 32 20 61 6e  values in pE2 an
2a4d0 64 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d  d pParse->pVdbe-
2a4e0 3e 65 78 70 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d  >expmask is.** m
2a4f0 6f 64 69 66 69 65 64 20 74 6f 20 72 65 63 6f 72  odified to recor
2a500 64 20 77 68 69 63 68 20 62 6f 75 6e 64 20 76 61  d which bound va
2a510 72 69 61 62 6c 65 73 20 61 72 65 20 72 65 66 65  riables are refe
2a520 72 65 6e 63 65 64 2e 20 20 49 66 20 70 50 61 72  renced.  If pPar
2a530 73 65 20 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20  se .** is NULL, 
2a540 74 68 65 6e 20 66 61 6c 73 65 20 77 69 6c 6c 20  then false will 
2a550 62 65 20 72 65 74 75 72 6e 65 64 20 69 66 20 70  be returned if p
2a560 45 31 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  E1 contains any 
2a570 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 2e  bound variables.
2a580 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64  .**.** When in d
2a590 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c  oubt, return fal
2a5a0 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74  se.  Returning t
2a5b0 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61  rue might give a
2a5c0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
2a5d0 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65  improvement.  Re
2a5e0 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69  turning false mi
2a5f0 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66  ght cause a perf
2a600 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
2a610 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c  n, but.** it wil
2a620 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68  l always give th
2a630 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
2a640 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c   and is hence al
2a650 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e  ways safe..*/.in
2a660 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  t sqlite3ExprImp
2a670 6c 69 65 73 45 78 70 72 28 50 61 72 73 65 20 2a  liesExpr(Parse *
2a680 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
2a690 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e  1, Expr *pE2, in
2a6a0 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73  t iTab){.  if( s
2a6b0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2a6c0 65 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70  e(pParse, pE1, p
2a6d0 45 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a  E2, iTab)==0 ){.
2a6e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2a6f0 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d  }.  if( pE2->op=
2a700 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71  =TK_OR.   && (sq
2a710 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2a720 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31  Expr(pParse, pE1
2a730 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54  , pE2->pLeft, iT
2a740 61 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab).            
2a750 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
2a760 6d 70 6c 69 65 73 45 78 70 72 28 70 50 61 72 73  mpliesExpr(pPars
2a770 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 52 69  e, pE1, pE2->pRi
2a780 67 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29  ght, iTab) ).  )
2a790 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
2a7a0 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f    }.  if( pE2->o
2a7b0 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26  p==TK_NOTNULL &&
2a7c0 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e   pE1->op!=TK_ISN
2a7d0 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d  ULL && pE1->op!=
2a7e0 54 4b 5f 49 53 20 29 7b 0a 20 20 20 20 45 78 70  TK_IS ){.    Exp
2a7f0 72 20 2a 70 58 20 3d 20 73 71 6c 69 74 65 33 45  r *pX = sqlite3E
2a800 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2a810 45 31 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  E1->pLeft);.    
2a820 74 65 73 74 63 61 73 65 28 20 70 58 21 3d 70 45  testcase( pX!=pE
2a830 31 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  1->pLeft );.    
2a840 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2a850 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2a860 58 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  X, pE2->pLeft, i
2a870 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Tab)==0 ) return
2a880 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2a890 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20   0;.}../*.** An 
2a8a0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2a8b0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2a8c0 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
2a8d0 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
2a8e0 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  * to determine i
2a8f0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
2a900 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64  can be evaluated
2a910 20 62 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f   by reference to
2a920 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e   the.** index on
2a930 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69  ly, without havi
2a940 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63  ng to do a searc
2a950 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  h for the corres
2a960 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65  ponding.** table
2a970 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78   entry.  The Idx
2a980 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64  Cover.pIdx field
2a990 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20   is the index.  
2a9a0 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a  IdxCover.iCur.**
2a9b0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
2a9c0 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  or the table..*/
2a9d0 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72  .struct IdxCover
2a9e0 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78   {.  Index *pIdx
2a9f0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64  ;     /* The ind
2aa00 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ex to be tested 
2aa10 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  for coverage */.
2aa20 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
2aa30 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
2aa40 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
2aa50 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2aa60 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  to the index */.
2aa70 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  };../*.** Check 
2aa80 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
2aa90 61 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  are references t
2aaa0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  o columns in tab
2aab0 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e  le .** pWalker->
2aac0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
2aad0 72 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69  r can be satisfi
2aae0 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64  ed using the ind
2aaf0 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75  ex.** pWalker->u
2ab00 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78  .pIdxCover->pIdx
2ab10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ab20 65 78 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c  exprIdxCover(Wal
2ab30 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2ab40 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66  pr *pExpr){.  if
2ab50 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2ab60 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78  COLUMN.   && pEx
2ab70 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c  pr->iTable==pWal
2ab80 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2ab90 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c  ->iCur.   && sql
2aba0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
2abb0 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  x(pWalker->u.pId
2abc0 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45  xCover->pIdx, pE
2abd0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a  xpr->iColumn)<0.
2abe0 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72    ){.    pWalker
2abf0 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ->eCode = 1;.   
2ac00 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2ac10 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
2ac20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2ac30 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
2ac40 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64   if an index pId
2ac50 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20  x on table with 
2ac60 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74  cursor iCur cont
2ac70 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65  ains will.** the
2ac80 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
2ac90 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  r.  Return true 
2aca0 69 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65  if the index doe
2acb0 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65  s cover the.** e
2acc0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61  xpression and fa
2acd0 6c 73 65 20 69 66 20 74 68 65 20 70 45 78 70 72  lse if the pExpr
2ace0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65   expression refe
2acf0 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c  rences table col
2ad00 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  umns.** that are
2ad10 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68   not found in th
2ad20 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  e index pIdx..**
2ad30 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76  .** An index cov
2ad40 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  ering an express
2ad50 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ion means that t
2ad60 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
2ad70 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65  n be.** evaluate
2ad80 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65  d using only the
2ad90 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f   index and witho
2ada0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f  ut having to loo
2adb0 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  kup the.** corre
2adc0 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65  sponding table e
2add0 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ntry..*/.int sql
2ade0 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42  ite3ExprCoveredB
2adf0 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a  yIndex(.  Expr *
2ae00 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
2ae10 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
2ae20 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
2ae30 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
2ae40 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e   /* The cursor n
2ae50 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f  umber for the co
2ae60 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
2ae70 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
2ae80 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  dx         /* Th
2ae90 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67  e index that mig
2aea0 68 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 63  ht be used for c
2aeb0 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  overage */.){.  
2aec0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75  Walker w;.  stru
2aed0 63 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76  ct IdxCover xcov
2aee0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
2aef0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
2af00 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72  xcov.iCur = iCur
2af10 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20  ;.  xcov.pIdx = 
2af20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43  pIdx;.  w.xExprC
2af30 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64  allback = exprId
2af40 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49  xCover;.  w.u.pI
2af50 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b  dxCover = &xcov;
2af60 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2af70 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20  pr(&w, pExpr);. 
2af80 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65   return !w.eCode
2af90 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ;.}.../*.** An i
2afa0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2afb0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2afc0 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
2afd0 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
2afe0 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65   to count refere
2aff0 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f  nces to table co
2b000 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67  lumns in the arg
2b010 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a  uments of an .**
2b020 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2b030 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ion, in order to
2b040 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
2b050 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
2b060 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69  nThisSrc() routi
2b070 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72  ne..*/.struct Sr
2b080 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69  cCount {.  SrcLi
2b090 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f  st *pSrc;   /* O
2b0a0 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52  ne particular FR
2b0b0 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e  OM clause in a n
2b0c0 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20  ested query */. 
2b0d0 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20   int nThis;     
2b0e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2b0f0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2b100 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74  umns in pSrcList
2b110 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72   */.  int nOther
2b120 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
2b130 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
2b140 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68  o columns in oth
2b150 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20  er FROM clauses 
2b160 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  */.};../*.** Cou
2b170 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
2b180 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
2b190 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
2b1a0 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75  c int exprSrcCou
2b1b0 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
2b1c0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2b1d0 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52  {.  /* The NEVER
2b1e0 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  () on the second
2b1f0 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65   term is because
2b200 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2b210 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20  UsesThisSrc().  
2b220 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  ** is always cal
2b230 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74  led before sqlit
2b240 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2b250 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f  regates() and so
2b260 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c   the.  ** TK_COL
2b270 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65  UMNs have not ye
2b280 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  t been converted
2b290 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
2b2a0 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71  UMN.  If.  ** sq
2b2b0 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
2b2c0 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73  sThisSrc() is us
2b2d0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69  ed differently i
2b2e0 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
2b2f0 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77  e.  ** NEVER() w
2b300 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ill need to be r
2b310 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28  emoved. */.  if(
2b320 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
2b330 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70  OLUMN || NEVER(p
2b340 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
2b350 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20  _COLUMN) ){.    
2b360 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
2b370 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20  t SrcCount *p = 
2b380 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43  pWalker->u.pSrcC
2b390 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  ount;.    SrcLis
2b3a0 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
2b3b0 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20  c;.    int nSrc 
2b3c0 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e  = pSrc ? pSrc->n
2b3d0 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72  Src : 0;.    for
2b3e0 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b  (i=0; i<nSrc; i+
2b3f0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
2b400 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
2b410 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
2b420 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
2b430 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b     if( i<nSrc ){
2b440 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b  .      p->nThis+
2b450 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
2b460 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b      p->nOther++;
2b470 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2b480 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2b490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
2b4a0 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74  mine if any of t
2b4b0 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
2b4c0 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69  the pExpr Functi
2b4d0 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  on reference.** 
2b4e0 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72  pSrcList.  Retur
2b4f0 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64  n true if they d
2b500 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20  o.  Also return 
2b510 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63  true if the func
2b520 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61  tion.** has no a
2b530 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20  rguments or has 
2b540 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72  only constant ar
2b550 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
2b560 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a   false if pExpr.
2b570 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f  ** references co
2b580 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f  lumns but not co
2b590 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20  lumns of tables 
2b5a0 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73  found in pSrcLis
2b5b0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2b5c0 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
2b5d0 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72  sSrc(Expr *pExpr
2b5e0 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c  , SrcList *pSrcL
2b5f0 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ist){.  Walker w
2b600 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f  ;.  struct SrcCo
2b610 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72  unt cnt;.  asser
2b620 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
2b630 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
2b640 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2b650 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e  ck = exprSrcCoun
2b660 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  t;.  w.xSelectCa
2b670 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e  llback = 0;.  w.
2b680 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63  u.pSrcCount = &c
2b690 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d  nt;.  cnt.pSrc =
2b6a0 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74   pSrcList;.  cnt
2b6b0 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e  .nThis = 0;.  cn
2b6c0 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20  t.nOther = 0;.  
2b6d0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
2b6e0 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78  ist(&w, pExpr->x
2b6f0 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  .pList);.  retur
2b700 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c  n cnt.nThis>0 ||
2b710 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a   cnt.nOther==0;.
2b720 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
2b730 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
2b740 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
2b750 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
2b760 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
2b770 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
2b780 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
2b790 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
2b7a0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
2b7b0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
2b7c0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
2b7d0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
2b7e0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
2b7f0 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
2b800 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
2b810 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
2b820 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
2b830 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
2b840 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
2b850 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  ol[0]),.       &
2b860 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
2b870 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
2b880 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
2b890 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
2b8a0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
2b8b0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2b8c0 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
2b8d0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
2b8e0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
2b8f0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
2b900 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
2b910 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
2b920 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
2b930 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74  ggInfoFunc(sqlit
2b940 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
2b950 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
2b960 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
2b970 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
2b980 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
2b990 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66  db, .       pInf
2b9a0 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->aFunc,.      
2b9b0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
2b9c0 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20  Func[0]),.      
2b9d0 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
2b9e0 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
2b9f0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
2ba00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2ba10 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63  the xExprCallbac
2ba20 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c  k for a tree wal
2ba30 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64  ker.  It is used
2ba40 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
2ba50 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2ba60 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
2ba70 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
2ba80 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2ba90 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
2baa0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
2bab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bac0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2bad0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2bae0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2baf0 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
2bb00 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
2bb10 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
2bb20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
2bb30 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
2bb40 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
2bb50 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
2bb60 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
2bb70 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
2bb80 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68  gInfo;..  switch
2bb90 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
2bba0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
2bbb0 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
2bbc0 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
2bbd0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2bbe0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
2bbf0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
2bc00 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2bc10 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
2bc20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
2bc30 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f  to see if the co
2bc40 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f  lumn is in one o
2bc50 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
2bc60 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a  the FROM.      *
2bc70 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
2bc80 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
2bc90 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
2bca0 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29  AYS(pSrcList!=0)
2bcb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
2bcc0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2bcd0 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73  *pItem = pSrcLis
2bce0 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f  t->a;.        fo
2bcf0 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73  r(i=0; i<pSrcLis
2bd00 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
2bd10 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2bd20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2bd30 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  _col *pCol;.    
2bd40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2bd50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2bd60 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
2bd70 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
2bd80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2bd90 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
2bda0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
2bdb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2bdc0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
2bdd0 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
2bde0 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
2bdf0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
2be00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
2be10 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
2be20 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
2be30 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
2be40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
2be50 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2be60 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
2be70 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
2be80 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
2be90 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
2bea0 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
2beb0 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
2bec0 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
2bed0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2bee0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
2bef0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
2bf00 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
2bf10 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
2bf20 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
2bf30 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
2bf40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2bf50 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
2bf60 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
2bf70 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
2bf80 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
2bf90 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
2bfa0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
2bfb0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2bfd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2bfe0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
2bff0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
2c000 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
2c010 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
2c020 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
2c030 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
2c040 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
2c050 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2c060 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
2c070 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
2c080 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2c090 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
2c0a0 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
2c0b0 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
2c0c0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
2c0d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c0e0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
2c0f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
2c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2c110 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
2c120 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2c130 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2c140 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
2c150 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
2c160 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
2c170 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2c180 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
2c190 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
2c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
2c1b0 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
2c1c0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
2c1d0 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
2c1e0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
2c1f0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
2c200 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2c210 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
2c220 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c230 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
2c240 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c250 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
2c260 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
2c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c280 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
2c290 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
2c2a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c2b0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
2c2c0 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
2c2d0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
2c2e0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
2c2f0 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
2c300 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
2c310 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
2c320 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2c330 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
2c340 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
2c350 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c370 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2c380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c3a0 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
2c3b0 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3d0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2c3e0 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
2c3f0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
2c400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c410 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2c420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2c430 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
2c440 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
2c450 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
2c460 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
2c470 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
2c480 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
2c490 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
2c4a0 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
2c4b0 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
2c4c0 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
2c4d0 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
2c4e0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
2c4f0 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
2c500 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
2c510 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
2c520 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
2c530 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
2c540 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
2c550 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
2c560 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
2c570 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2c580 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2c590 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
2c5a0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
2c5b0 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
2c5c0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
2c5d0 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20  = (i16)k;.      
2c5e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c5f0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69         } /* endi
2c600 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  f pExpr->iTable=
2c610 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
2c620 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  */.        } /* 
2c630 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53  end loop over pS
2c640 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  rcList */.      
2c650 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
2c660 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
2c670 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
2c680 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
2c690 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
2c6a0 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75  ags & NC_InAggFu
2c6b0 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  nc)==0.       &&
2c6c0 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
2c6d0 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70  Depth==pExpr->op
2c6e0 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  2.      ){.     
2c6f0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
2c700 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
2c710 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
2c720 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
2c730 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
2c740 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
2c750 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
2c760 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
2c770 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2c780 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2c790 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
2c7a0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
2c7b0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2c7c0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2c7d0 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
2c7e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2c7f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2c800 61 72 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 45  are(0, pItem->pE
2c810 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d  xpr, pExpr, -1)=
2c820 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c830 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2c840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2c850 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41         if( i>=pA
2c860 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b  ggInfo->nFunc ){
2c870 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45  .          /* pE
2c880 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e  xpr is original.
2c890 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74    Make a new ent
2c8a0 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  ry in pAggInfo->
2c8b0 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20  aFunc[].        
2c8c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
2c8d0 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
2c8e0 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  se->db);.       
2c8f0 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66     i = addAggInf
2c900 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62  oFunc(pParse->db
2c910 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20  , pAggInfo);.   
2c920 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
2c930 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2c940 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2c950 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2c960 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2c970 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2c980 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  m = &pAggInfo->a
2c990 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Func[i];.       
2c9a0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70       pItem->pExp
2c9b0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
2c9c0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d         pItem->iM
2c9d0 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
2c9e0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
2c9f0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2ca00 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2ca10 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
2ca20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2ca30 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69  em->pFunc = sqli
2ca40 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
2ca50 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2ca70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
2ca80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ca90 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69      pExpr->x.pLi
2caa0 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st ? pExpr->x.pL
2cab0 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
2cac0 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
2cad0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
2cae0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
2caf0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
2cb00 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
2cb10 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
2cb20 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
2cb30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cb40 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2cb50 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
2cb60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2cb70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cb80 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
2cb90 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
2cba0 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
2cbb0 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
2cbc0 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
2cbd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
2cbe0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2cbf0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2cc00 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2cc10 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
2cc20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2cc30 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
2cc40 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
2cc50 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
2cc60 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20  (i16)i;.        
2cc70 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
2cc80 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
2cc90 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2cca0 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rune;.      }els
2ccb0 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
2ccc0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2ccd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2cce0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2ccf0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
2cd00 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
2cd10 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28  regatesInSelect(
2cd20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2cd30 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2cd40 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2cd50 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a  METER(pSelect);.
2cd60 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65    pWalker->walke
2cd70 72 44 65 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75  rDepth++;.  retu
2cd80 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2cd90 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
2cda0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2cdb0 49 6e 53 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b  InSelectEnd(Walk
2cdc0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2cdd0 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
2cde0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2cdf0 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57  R(pSelect);.  pW
2ce00 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
2ce10 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  th--;.}../*.** A
2ce20 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72  nalyze the pExpr
2ce30 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
2ce40 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
2ce50 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
2ce60 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
2ce70 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
2ce80 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66   added to AggInf
2ce90 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e  o object that pN
2cea0 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70  C->pAggInfo.** p
2ceb0 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74  oints to.  Addit
2cec0 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72  ional entries ar
2ced0 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67  e made on the Ag
2cee0 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a  gInfo object as.
2cef0 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  ** necessary..**
2cf00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2cf10 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2cf20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
2cf30 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2cf40 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
2cf50 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   by sqlite3Resol
2cf60 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a  veExprNames()..*
2cf70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2cf80 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2cf90 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
2cfa0 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
2cfb0 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
2cfc0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2cfd0 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
2cfe0 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63  gate;.  w.xSelec
2cff0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  tCallback = anal
2d000 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2d010 65 6c 65 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65  elect;.  w.xSele
2d020 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e  ctCallback2 = an
2d030 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
2d040 6e 53 65 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e  nSelectEnd;.  w.
2d050 77 61 6c 6b 65 72 44 65 70 74 68 20 3d 20 30 3b  walkerDepth = 0;
2d060 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43  .  w.u.pNC = pNC
2d070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ;.  assert( pNC-
2d080 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a  >pSrcList!=0 );.
2d090 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
2d0a0 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
2d0b0 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
2d0c0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2d0d0 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65  gregates() for e
2d0e0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
2d0f0 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73  in an.** express
2d100 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ion list.  Retur
2d110 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2d120 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  errors..**.** If
2d130 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75   an error is fou
2d140 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  nd, the analysis
2d150 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a   is cut short..*
2d160 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2d170 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2d180 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
2d190 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  C, ExprList *pLi
2d1a0 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  st){.  struct Ex
2d1b0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
2d1c0 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
2d1d0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
2d1e0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
2d1f0 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
2d200 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
2d210 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  tem++){.      sq
2d220 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2d230 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20  Aggregates(pNC, 
2d240 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
2d250 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2d260 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e  * Allocate a sin
2d270 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72  gle new register
2d280 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64   for use to hold
2d290 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61   some intermedia
2d2a0 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e  te result..*/.in
2d2b0 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
2d2c0 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
2d2d0 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
2d2e0 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b  ->nTempReg==0 ){
2d2f0 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50  .    return ++pP
2d300 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a  arse->nMem;.  }.
2d310 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
2d320 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72  >aTempReg[--pPar
2d330 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d  se->nTempReg];.}
2d340 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
2d350 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d  te a register, m
2d360 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20  aking available 
2d370 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f  for reuse for so
2d380 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70  me other.** purp
2d390 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ose..**.** If a 
2d3a0 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72  register is curr
2d3b0 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64  ently being used
2d3c0 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   by the column c
2d3d0 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  ache, then.** th
2d3e0 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  e deallocation i
2d3f0 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
2d400 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
2d410 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73  e line that uses
2d420 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
2d430 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a   becomes stale..
2d440 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
2d450 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61  eleaseTempReg(Pa
2d460 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2d470 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52   iReg){.  if( iR
2d480 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  eg && pParse->nT
2d490 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
2d4a0 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
2d4b0 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  g) ){.    int i;
2d4c0 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c  .    struct yCol
2d4d0 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f  Cache *p;.    fo
2d4e0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
2d4f0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50  >aColCache; i<pP
2d500 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
2d510 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
2d520 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69    if( p->iReg==i
2d530 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Reg ){.        p
2d540 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20  ->tempReg = 1;. 
2d550 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
2d560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2d570 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2d580 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
2d590 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20  eg++] = iReg;.  
2d5a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
2d5b0 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
2d5c0 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65  e a block of nRe
2d5d0 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65  g consecutive re
2d5e0 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20  gisters..*/.int 
2d5f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
2d600 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2d610 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
2d620 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
2d630 6e 52 65 67 3d 3d 31 20 29 20 72 65 74 75 72 6e  nReg==1 ) return
2d640 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2d650 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 20  eg(pParse);.  i 
2d660 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  = pParse->iRange
2d670 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73  Reg;.  n = pPars
2d680 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->nRangeReg;.  
2d690 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20  if( nReg<=n ){. 
2d6a0 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65 64     assert( !used
2d6b0 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
2d6c0 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20  arse, i, i+n-1) 
2d6d0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
2d6e0 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67  RangeReg += nReg
2d6f0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  ;.    pParse->nR
2d700 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b  angeReg -= nReg;
2d710 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20  .  }else{.    i 
2d720 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
2d730 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
2d740 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a  em += nReg;.  }.
2d750 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f    return i;.}.vo
2d760 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
2d770 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  eTempRange(Parse
2d780 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
2d790 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
2d7a0 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
2d7b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2d7c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
2d7d0 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74  , iReg);.    ret
2d7e0 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
2d7f0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
2d800 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
2d810 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65  nReg);.  if( nRe
2d820 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g>pParse->nRange
2d830 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Reg ){.    pPars
2d840 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e  e->nRangeReg = n
2d850 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
2d860 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65  >iRangeReg = iRe
2d870 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
2d880 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61  Mark all tempora
2d890 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20  ry registers as 
2d8a0 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c  being unavailabl
2d8b0 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a  e for reuse..*/.
2d8c0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
2d8d0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61  rTempRegCache(Pa
2d8e0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
2d8f0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2d900 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
2d910 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d  nRangeReg = 0;.}
2d920 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65  ../*.** Validate
2d930 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61   that no tempora
2d940 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c  ry register fall
2d950 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  s within the ran
2d960 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e  ge of.** iFirst.
2d970 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76  .iLast, inclusiv
2d980 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2d990 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72   is only call fr
2d9a0 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  om within assert
2d9b0 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ().** statements
2d9c0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2d9d0 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
2d9e0 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e  ite3NoTempsInRan
2d9f0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
2da00 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e  , int iFirst, in
2da10 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20  t iLast){.  int 
2da20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  i;.  if( pParse-
2da30 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20  >nRangeReg>0.   
2da40 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67  && pParse->iRang
2da50 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61  eReg+pParse->nRa
2da60 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73 74 0a  ngeReg > iFirst.
2da70 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
2da80 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61 73 74  angeReg <= iLast
2da90 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  .  ){.     retur
2daa0 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
2dab0 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
2dac0 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  empReg; i++){.  
2dad0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54    if( pParse->aT
2dae0 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73  empReg[i]>=iFirs
2daf0 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65  t && pParse->aTe
2db00 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20  mpReg[i]<=iLast 
2db10 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2db20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
2db30 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2db40 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
2db50 47 20 2a 2f 0a                                   G */.