/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 4cb4ca6357b28fee2202d2b2bc5be83a439c65da03195ba5dc4dcece675ffce0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
0fd0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
0fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
0ff0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1000: 29 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  ) works the same
1010: 20 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72   exact that it r
1020: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65  eturns the.** de
1030: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1040: 69 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20  if pExpr has no 
1050: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
1060: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  n..**.** The col
1070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1080: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
1090: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
10a0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
10b0: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
10c0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
10d0: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
10f0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
1100: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
1110: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
1120: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
1130: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
1140: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
1150: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1160: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1180: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1190: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
11b0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
11c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
11d0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
11e0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
11f0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >op;.    if( p->
1200: 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72  flags & EP_Gener
1210: 69 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ic ) break;.    
1220: 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f  if( (op==TK_AGG_
1230: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
1240: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
1250: 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    || op==TK_REGI
1260: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54  STER || op==TK_T
1270: 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26 20  RIGGER).     && 
1280: 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 29  p->pTab!=0.    )
1290: 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54  {.      /* op==T
12a0: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
12b0: 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73  >pTab!=0 happens
12c0: 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20   when pExpr was 
12d0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20  originally.     
12e0: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
12f0: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
1300: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
1310: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
1320: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  ister */.      i
1330: 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  nt j = p->iColum
1340: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  n;.      if( j>=
1350: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
1360: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
1370: 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a   p->pTab->aCol[j
1380: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
1390: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
13a0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
13b0: 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
13c0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13e0: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
13f0: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1400: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1410: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1420: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1430: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1440: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1450: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1460: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
1470: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
1480: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
1490: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
14a0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
14b0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
14c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14d0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
14e0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
14f0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
1500: 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67   (p->pLeft->flag
1510: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
1520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20  =0 ){.        p 
1530: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1550: 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20 3d 20   Expr *pNext  = 
1560: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1570: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
1580: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
1590: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
15a0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
15b0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
15c0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
15d0: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
15e0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
15f0: 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68 6f 6c   /* p->flags hol
1600: 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20 61 6e  ds EP_Collate an
1610: 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  d p->pLeft->flag
1620: 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41 6e 64  s does not.  And
1630: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 78  .        ** p->x
1640: 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f 74 2e  .pSelect cannot.
1650: 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70 4c 65    So if p->x.pLe
1660: 66 74 20 65 78 69 73 74 73 2c 20 69 74 20 6d 75  ft exists, it mu
1670: 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20 20 20  st hold at.     
1680: 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20     ** least one 
1690: 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68 75 73  EP_Collate. Thus
16a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
16b0: 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a 20 20  wo ALWAYS. */.  
16c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 2e 70        if( p->x.p
16d0: 4c 69 73 74 21 3d 30 20 26 26 20 41 4c 57 41 59  List!=0 && ALWAY
16e0: 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  S(!ExprHasProper
16f0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
1700: 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ct)) ){.        
1710: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
1730: 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  YS(i<p->x.pList-
1740: 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20  >nExpr); i++){. 
1750: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45             if( E
1760: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1770: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1780: 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74  pExpr, EP_Collat
1790: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
17a0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78      pNext = p->x
17b0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
17c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1800: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
1810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1820: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
1830: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1840: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
1850: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
1860: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
1870: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1880: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
1890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
18a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18b0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
18c0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
18d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
18e0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
18f0: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
1900: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1910: 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c 6c  .** defautl coll
1920: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
1930: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1950: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
1960: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1970: 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  q() routine work
1980: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
1990: 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65 74  t that it.** ret
19a0: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19b0: 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64  re is no defined
19c0: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 43   collation..*/.C
19d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
19e0: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61 72  xprNNCollSeq(Par
19f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a00: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
1a10: 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Seq *p = sqlite3
1a20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1a30: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  se, pExpr);.  if
1a40: 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50 61  ( p==0 ) p = pPa
1a50: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1a60: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  ll;.  assert( p!
1a70: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a90: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74 77  n TRUE if the tw
1aa0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68 61  o expressions ha
1ab0: 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  ve equivalent co
1ac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ad0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1ae0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63  3ExprCollSeqMatc
1af0: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1b00: 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
1b10: 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53 65   *pE2){.  CollSe
1b20: 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c 69  q *pColl1 = sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a 20  (pParse, pE1);. 
1b50: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
1b60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
1b70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b80: 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  pE2);.  return s
1b90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ba0: 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f  oll1->zName, pCo
1bb0: 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b 0a  ll2->zName)==0;.
1bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1bd0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
1be0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1bf0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1c00: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1c10: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1c20: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1c30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c40: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1c50: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1c60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1c70: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1c80: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
1c90: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1ca0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
1cb0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
1cc0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
1cd0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1ce0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1cf0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1d00: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1d10: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1d20: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1d30: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1d40: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1d50: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1d60: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1d70: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1d80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d90: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1da0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
1db0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1dc0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
1dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1de0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1e00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1e10: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1e20: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1e30: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1e40: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1e50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e60: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1e70: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1e80: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1eb0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ec0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ed0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1ee0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1ef0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1f00: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1f10: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1f20: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1f30: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1f40: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1f50: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1f60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1f70: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1f80: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1f90: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1fa0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1fb0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1fc0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1fd0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1fe0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1ff0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2000: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2010: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2020: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2030: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2040: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2050: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2060: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2070: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
2080: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
2090: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
20a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
20b0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
20c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
20d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
20e0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
20f0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2100: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2110: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2120: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2130: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2140: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2150: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2160: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2170: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
2180: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
2190: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
21b0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
21c0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
21f0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2200: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2210: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2220: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2230: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2240: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2250: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2260: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2270: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
2280: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
2290: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
22a0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
22b0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
22c0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
22d0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
22e0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
22f0: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2300: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2310: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2320: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2330: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2340: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2350: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2360: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2370: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
2380: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
2390: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
23a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23b0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
23c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
23d0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
23e0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
23f0: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2400: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2410: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2420: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2430: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2440: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2460: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2470: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2480: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
2490: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
24a0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
24b0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
24c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
24d0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
24e0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
24f0: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2500: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2510: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2520: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2530: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2540: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2550: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2560: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2570: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2580: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
2590: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
25a0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
25b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25c0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
25d0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
25e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
25f0: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2600: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2610: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2620: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2630: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2640: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2650: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2660: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2670: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2680: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
2690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
26a0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
26b0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
26c0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
26d0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
26e0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
26f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2700: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2710: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2720: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2730: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2740: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2750: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2760: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2770: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2780: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
2790: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
27a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27b0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
27c0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
27d0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
27e0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
27f0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2800: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2810: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2820: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2830: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2840: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2850: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2860: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2870: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2880: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
2890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
28b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
28c0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
28d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
28e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
28f0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2900: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2910: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2920: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2940: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2950: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2960: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2970: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2980: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
2990: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
29a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
29b0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
29c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
29d0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
29e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
29f0: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2a00: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2a10: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2a20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2a30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2a40: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2a50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2a70: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2a80: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
2a90: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
2aa0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
2ab0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
2ac0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
2ad0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
2ae0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2af0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2b00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2b10: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2b20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2b30: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2b40: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2b50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2b60: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2b70: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2b80: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
2b90: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
2ba0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2bb0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
2bc0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
2bd0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2c00: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2c10: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2c20: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2c30: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2c40: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2c60: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2c70: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2c80: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
2c90: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
2ca0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
2cb0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
2cc0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
2cd0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
2ce0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2cf0: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2d00: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2d10: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2d20: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2d30: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2d40: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2d50: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2d60: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2d70: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2d80: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
2d90: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
2da0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
2db0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
2dc0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
2dd0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
2de0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2e00: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2e20: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2e30: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2e60: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2e70: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2e80: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2e90: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ea0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2eb0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ec0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ed0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2ee0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2ef0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2f00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2f10: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2f20: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2f30: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2f40: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2f50: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2f60: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2f70: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2f80: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2fb0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2fc0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2fd0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2fe0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2ff0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
3000: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
3010: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
3020: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
3030: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
3040: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
3050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3060: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
3070: 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70  bexpression of p
3080: 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74  Vector that is t
3090: 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d  he i-th.** colum
30a0: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
30b0: 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69  (numbered starti
30c0: 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65  ng with 0).  The
30d0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
30e0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73  ensure that i is
30f0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a   within range..*
3100: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3110: 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c  is really a scal
3120: 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22  ar (and "scalar"
3130: 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73   here includes s
3140: 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61  ubqueries.** tha
3150: 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  t return a singl
3160: 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20  e column!) then 
3170: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75  return pVector u
3180: 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  nmodified..**.**
3190: 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73   pVector retains
31a0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
31b0: 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65 78  e returned subex
31c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
31d0: 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69 73  If the vector is
31e0: 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20   a (SELECT ...) 
31f0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
3200: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a  ion returned is.
3210: 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70 72  ** just the expr
3220: 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  ession for the i
3230: 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
3240: 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
3250: 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65  may.** not be re
3260: 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ady for evaluati
3270: 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74  on because the t
3280: 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20  able cursor has 
3290: 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
32a0: 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45  positioned..*/.E
32b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74  xpr *sqlite3Vect
32c0: 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45  orFieldSubexpr(E
32d0: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e  xpr *pVector, in
32e0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
32f0: 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  i<sqlite3ExprVec
3300: 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29  torSize(pVector)
3310: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
3320: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56  3ExprIsVector(pV
3330: 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73  ector) ){.    as
3340: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f  sert( pVector->o
3350: 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72  p2==0 || pVector
3360: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
3370: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65  R );.    if( pVe
3380: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3390: 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e  ECT || pVector->
33a0: 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  op2==TK_SELECT )
33b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
33c0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
33d0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
33e0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
33f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3400: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3410: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3430: 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  pVector;.}../*.*
3440: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
3450: 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20  turn a new Expr 
3460: 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65  object which whe
3470: 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73  n passed to.** s
3480: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
3490: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61   will generate a
34a0: 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64  ll necessary cod
34b0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  e to compute.** 
34c0: 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f  the iField-th co
34d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
34e0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56  or expression pV
34f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ector..**.** It 
3500: 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f  is ok for pVecto
3510: 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  r to be a scalar
3520: 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69   (as long as iFi
3530: 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e  eld==0).  .** In
3540: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
3550: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
3560: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44  ike sqlite3ExprD
3570: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  up()..**.** The 
3580: 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20  caller owns the 
3590: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
35a0: 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70  ject and is resp
35b0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65  onsible for.** e
35c0: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
35d0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
35e0: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
35f0: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  freed..**.** The
3600: 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20   caller retains 
3610: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65  ownership of pVe
3620: 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f  ctor.  If pVecto
3630: 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54  r is a TK_SELECT
3640: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
3650: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77 69  turned object wi
3660: 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65  ll reference pVe
3670: 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63  ctor and so pVec
3680: 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a  tor must remain.
3690: 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ** valid for the
36a0: 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74   life of the ret
36b0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49  urned object.  I
36c0: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
36d0: 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61  K_VECTOR.** or a
36e0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
36f0: 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20  on, then it can 
3700: 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
3710: 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  on as this routi
3720: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a  ne.** returns..*
3730: 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20  *.** A trick to 
3740: 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43  cause a TK_SELEC
3750: 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20  T pVector to be 
3760: 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72  deleted together
3770: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74   with.** the ret
3780: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3790: 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74  t is to attach t
37a0: 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68  he pVector to th
37b0: 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a  e pRight field.*
37c0: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
37d0: 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  d TK_SELECT_COLU
37e0: 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a  MN Expr object..
37f0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3800: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
3810: 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ld(.  Parse *pPa
3820: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3830: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3840: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3850: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
3860: 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20  ector.  List of 
3870: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61  expressions or a
3880: 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20   sub-SELECT */. 
3890: 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20   int iField     
38a0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
38b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
38c0: 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  tor to return */
38d0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74  .){.  Expr *pRet
38e0: 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d  ;.  if( pVector-
38f0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
3910: 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45  ector->flags & E
3920: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20  P_xIsSelect );. 
3930: 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c     /* The TK_SEL
3940: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3950: 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  node:.    **.   
3960: 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20   ** pLeft:      
3970: 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e       pVector con
3980: 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43  taining TK_SELEC
3990: 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e  T.  Not deleted.
39a0: 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20  .    ** pRight: 
39b0: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65           not use
39c0: 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76  d.  But recursiv
39d0: 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  ely deleted..   
39e0: 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20   ** iColumn:    
39f0: 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20       Index of a 
3a00: 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f  column in pVecto
3a10: 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a  r.    ** iTable:
3a20: 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20 74            0 or t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
3a40: 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53 20  umns on the LHS 
3a50: 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74  of an assignment
3a60: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3a70: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3a80: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3a90: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3aa0: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3ab0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3ac0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
3ad0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
3ae0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
3af0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
3b00: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
3b10: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3b20: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3b30: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3b40: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3b50: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3b60: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3b70: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3b80: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3b90: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3ba0: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3bb0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
3bc0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
3bd0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
3be0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
3bf0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
3c00: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3c10: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3c20: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3c30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3c40: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3c50: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3c60: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3c70: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3c80: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3c90: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3ca0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3cb0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
3cc0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Ret ){.      pRe
3cd0: 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69  t->iColumn = iFi
3ce0: 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  eld;.      pRet-
3cf0: 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72  >pLeft = pVector
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3d10: 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70  rt( pRet==0 || p
3d20: 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  Ret->iTable==0 )
3d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
3d50: 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63  TK_VECTOR ) pVec
3d60: 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  tor = pVector->x
3d70: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
3d80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65  ].pExpr;.    pRe
3d90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3da0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
3db0: 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a  Vector, 0);.  }.
3dc0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
3de0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f  ssion pExpr is o
3df0: 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54  f type TK_SELECT
3e00: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
3e10: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69  to evaluate.** i
3e20: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  t. Return the re
3e30: 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20  gister in which 
3e40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
3e50: 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65  ored (or, if the
3e60: 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
3e70: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3e80: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  n one column, th
3e90: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3ea0: 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74  ray.** of regist
3eb0: 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65  ers in which the
3ec0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3ed0: 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  d)..**.** If pEx
3ee0: 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53  pr is not a TK_S
3ef0: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3f00: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
3f10: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
3f20: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
3f30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3f40: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
3f50: 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  eg = 0;.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3f70: 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
3f80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3f90: 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c  ){.    reg = sql
3fa0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
3fb0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
3fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
3fd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
3fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
3ff0: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
4000: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
4010: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4020: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4030: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4040: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4050: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4060: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4070: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4080: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
4090: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
40a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
40b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
40c0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
40d0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
40e0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
40f0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
4100: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
4110: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4120: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4130: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4140: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4150: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4160: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4170: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4180: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
4190: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
41a0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
41b0: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
41c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
41d0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
41e0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
41f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
4200: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
4210: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4220: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4230: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4240: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4250: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4260: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4270: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4280: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
4290: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
42a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
42b0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
42c0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
42d0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
42e0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
42f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4300: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
4310: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4320: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4330: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4340: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4350: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
4390: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
43a0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
43b0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
43c0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
43d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
43e0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
4410: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4420: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4450: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4460: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4470: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4480: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
4490: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
44a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
44b0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
44c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
44d0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
44e0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
44f0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
4500: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4510: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4520: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4530: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4540: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4550: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4560: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4570: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4580: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
45a0: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
45b0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
45c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
45d0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
45e0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
45f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
4600: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
4610: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4620: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4630: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4640: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4650: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4660: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4670: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4680: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
4690: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
46a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
46b0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
46c0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
46d0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
46e0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
46f0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4700: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
4710: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4720: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4730: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4740: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4750: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4770: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4780: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
4790: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
47a0: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
47b0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
47c0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
47d0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
47e0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
47f0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
4800: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4820: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4830: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4840: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4850: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4860: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4870: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4880: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4890: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
48a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
48b0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
48c0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
48d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
48e0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
48f0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4900: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
4910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4920: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4930: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4950: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4960: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4970: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4980: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4990: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
49a0: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
49b0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
49c0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
49d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
49e0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
49f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4a00: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4a10: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4a20: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4a30: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4a50: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  abel(v);..  if( 
4a60: 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45 78  nLeft!=sqlite3Ex
4a70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69  prVectorSize(pRi
4a80: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
4a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4aa0: 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
4ab0: 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72 65  isused");.    re
4ac0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ad0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4ae0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
4af0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
4b20: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20  p==TK_ISNOT .   
4b30: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72  ==TK_LT || pExpr
4b50: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20  ->op==TK_GT .   
4b60: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b70: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72  ==TK_LE || pExpr
4b80: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29  ->op==TK_GE .  )
4b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
4ba0: 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45  r->op==op || (pE
4bb0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26  xpr->op==TK_IS &
4bc0: 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20  & op==TK_EQ).   
4bd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78           || (pEx
4be0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4bf0: 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29   && op==TK_NE) )
4c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c10: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d  0 || pExpr->op!=
4c20: 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  op );.  assert( 
4c30: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4c40: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
4c50: 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53  op );..  p5 |= S
4c60: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20  QLITE_STOREP2;. 
4c70: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20   if( opx==TK_LE 
4c80: 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20  ) opx = TK_LT;. 
4c90: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20   if( opx==TK_GE 
4ca0: 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a  ) opx = TK_GT;..
4cb0: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4cc0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4cd0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4ce0: 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43  regRight = exprC
4cf0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
4d00: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20  rse, pRight);.. 
4d10: 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f   for(i=0; 1 /*Lo
4d20: 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65  op exits by "bre
4d30: 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20  ak"*/; i++){.   
4d40: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
4d50: 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  0, regFree2 = 0;
4d60: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a  .    Expr *pL, *
4d70: 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c  pR; .    int r1,
4d80: 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28   r2;.    assert(
4d90: 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74   i>=0 && i<nLeft
4da0: 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 65 78 70   );.    r1 = exp
4db0: 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28  rVectorRegister(
4dc0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 69  pParse, pLeft, i
4dd0: 2c 20 72 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20  , regLeft, &pL, 
4de0: 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
4df0: 72 32 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52  r2 = exprVectorR
4e00: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
4e10: 70 52 69 67 68 74 2c 20 69 2c 20 72 65 67 52 69  pRight, i, regRi
4e20: 67 68 74 2c 20 26 70 52 2c 20 26 72 65 67 46 72  ght, &pR, &regFr
4e30: 65 65 32 29 3b 0a 20 20 20 20 63 6f 64 65 43 6f  ee2);.    codeCo
4e40: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
4e50: 2c 20 70 52 2c 20 6f 70 78 2c 20 72 31 2c 20 72  , pR, opx, r1, r
4e60: 32 2c 20 64 65 73 74 2c 20 70 35 29 3b 0a 20 20  2, dest, p5);.  
4e70: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
4e80: 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
4e90: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
4ea0: 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  t);.    testcase
4eb0: 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
4ec0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4ed0: 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 74 65  ==OP_Le);.    te
4ee0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
4ef0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4f00: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
4f10: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4f20: 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
4f30: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f40: 5f 47 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Ge);.    testca
4f50: 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
4f60: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f70: 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
4f80: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f90: 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ne); VdbeCoverag
4fa0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29  eIf(v,op==OP_Ne)
4fb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
4fc0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
4fd0: 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
4fe0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4ff0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5000: 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20   regFree2);.    
5010: 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 31 20 29  if( i==nLeft-1 )
5020: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
5030: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 78     }.    if( opx
5040: 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20  ==TK_EQ ){.     
5050: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5060: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
5070: 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b  dest, addrDone);
5080: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5090: 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20 53 51  ;.      p5 |= SQ
50a0: 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20  LITE_KEEPNULL;. 
50b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 78     }else if( opx
50c0: 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20 20 20 20  ==TK_NE ){.     
50d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
50e0: 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 64 65 73  p2(v, OP_If, des
50f0: 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56 64  t, addrDone); Vd
5100: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5110: 20 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54       p5 |= SQLIT
5120: 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20  E_KEEPNULL;.    
5130: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
5140: 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c  ert( op==TK_LT |
5150: 7c 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f  | op==TK_GT || o
5160: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p==TK_LE || op==
5170: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 73  TK_GE );.      s
5180: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5190: 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71  (v, OP_ElseNotEq
51a0: 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a  , 0, addrDone);.
51b0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
51c0: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
51d0: 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
51e0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
51f0: 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_GT);.      Vd
5200: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
5210: 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20  op==TK_LE);.    
5220: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
5230: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a  (v, op==TK_GE);.
5240: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65        if( i==nLe
5250: 66 74 2d 32 20 29 20 6f 70 78 20 3d 20 6f 70 3b  ft-2 ) opx = op;
5260: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
5270: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
5280: 61 62 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e 65  abel(v, addrDone
5290: 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
52a0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
52b0: 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  0./*.** Check th
52c0: 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69  at argument nHei
52d0: 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ght is less than
52e0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
52f0: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72   maximum.** expr
5300: 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c  ession depth all
5310: 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  owed. If it is n
5320: 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ot, leave an err
5330: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a  or message in.**
5340: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20   pParse..*/.int 
5350: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
5360: 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50  Height(Parse *pP
5370: 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68  arse, int nHeigh
5380: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
5390: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
53a0: 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73  mxHeight = pPars
53b0: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
53c0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
53d0: 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48  DEPTH];.  if( nH
53e0: 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29  eight>mxHeight )
53f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5400: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
5410: 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f        "Expressio
5420: 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61  n tree is too la
5430: 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70  rge (maximum dep
5440: 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68  th %d)", mxHeigh
5450: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20  t.    );.    rc 
5460: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
5470: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5480: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  .}../* The follo
5490: 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74  wing three funct
54a0: 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78  ions, heightOfEx
54b0: 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78  pr(), heightOfEx
54c0: 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20  prList().** and 
54d0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29  heightOfSelect()
54e0: 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65  , are used to de
54f0: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69  termine the maxi
5500: 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66  mum height.** of
5510: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
5520: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20  tree referenced 
5530: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
5540: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
5550: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
5560: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
5570: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69  maximum height i
5580: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
5590: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
55a0: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
55b0: 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20  y pnHeight, the 
55c0: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
55d0: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65  , then set *pnHe
55e0: 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  ight to that.** 
55f0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
5600: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
5610: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
5620: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
5630: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
5640: 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69  ->nHeight>*pnHei
5650: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ght ){.      *pn
5660: 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69  Height = p->nHei
5670: 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ght;.    }.  }.}
5680: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5690: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78  ghtOfExprList(Ex
56a0: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a  prList *p, int *
56b0: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
56c0: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
56d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
56e0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  p->nExpr; i++){.
56f0: 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78        heightOfEx
5700: 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pr(p->a[i].pExpr
5710: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5720: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5730: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c  void heightOfSel
5740: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 53 65 6c  ect(Select *pSel
5750: 65 63 74 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67  ect, int *pnHeig
5760: 68 74 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ht){.  Select *p
5770: 3b 0a 20 20 66 6f 72 28 70 3d 70 53 65 6c 65 63  ;.  for(p=pSelec
5780: 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f  t; p; p=p->pPrio
5790: 72 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  r){.    heightOf
57a0: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
57b0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
57c0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
57d0: 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74  Having, pnHeight
57e0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
57f0: 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70  xpr(p->pLimit, p
5800: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5810: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5820: 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67  ->pEList, pnHeig
5830: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5840: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  fExprList(p->pGr
5850: 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29  oupBy, 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 4f 72 64 65 72  prList(p->pOrder
5880: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
5890: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
58a0: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
58b0: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
58c0: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
58d0: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
58e0: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
58f0: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
5900: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
5910: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
5920: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
5930: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
5940: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
5950: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
5960: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
5970: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5980: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
5990: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
59a0: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a   plus one..**.**
59b0: 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20   Also propagate 
59c0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
59d0: 67 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e  gs up from Expr.
59e0: 78 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e  x.pList to Expr.
59f0: 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70  flags,.** if app
5a00: 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
5a10: 74 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74  tic void exprSet
5a20: 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b  Height(Expr *p){
5a30: 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d  .  int nHeight =
5a40: 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78   0;.  heightOfEx
5a50: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48  pr(p->pLeft, &nH
5a60: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
5a70: 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  OfExpr(p->pRight
5a80: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69  , &nHeight);.  i
5a90: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
5aa0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
5ab0: 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ct) ){.    heigh
5ac0: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70  tOfSelect(p->x.p
5ad0: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
5ae0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
5af0: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
5b00: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5b10: 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  t(p->x.pList, &n
5b20: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e  Height);.    p->
5b30: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
5b40: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
5b50: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
5b60: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  x.pList);.  }.  
5b70: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
5b80: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
5b90: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
5ba0: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
5bb0: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
5bc0: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
5bd0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
5be0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
5bf0: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
5c00: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
5c10: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
5c20: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
5c30: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   pParse..**.** A
5c40: 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c  lso propagate al
5c50: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
5c60: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
5c70: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
5c80: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
5c90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
5ca0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
5cb0: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
5cc0: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
5cd0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
5ce0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70   ) return;.  exp
5cf0: 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20  rSetHeight(p);. 
5d00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
5d10: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
5d20: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a  p->nHeight);.}..
5d30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5d40: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5d50: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
5d60: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
5d70: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
5d80: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
5d90: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
5da0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
5db0: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
5dc0: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
5dd0: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
5de0: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
5df0: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
5e00: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
5e10: 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42  t;.}.#else /* AB
5e20: 4f 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66  OVE:  Height enf
5e30: 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64  orcement enabled
5e40: 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74  .  BELOW: Height
5e50: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66   enforcement off
5e60: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67   */./*.** Propag
5e70: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5e80: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5e90: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5ea0: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5eb0: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5ec0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5ed0: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5ee0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5ef0: 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
5f00: 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78  ->x.pList && !Ex
5f10: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5f20: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
5f30: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  {.    p->flags |
5f40: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
5f50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5f60: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
5f70: 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  );.  }.}.#define
5f80: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
5f90: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
5fa0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
5fb0: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
5fc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
5fd0: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
5fe0: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
5ff0: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
6000: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
6010: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
6020: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
6030: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
6040: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
6050: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
6060: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
6070: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
6080: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
6090: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
60a0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
60b0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
60c0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
60d0: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
60e0: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
60f0: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
6100: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
6110: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
6120: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
6130: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
6140: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
6150: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
6160: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  ting is performe
6170: 64 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  d.  The deQuote.
6180: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
6190: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
61a0: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
61b0: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
61c0: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
61d0: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
61e0: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
61f0: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
6200: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
6210: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
6220: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
6230: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
6240: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
6250: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
6260: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
6270: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
6280: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
6290: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
62a0: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
62b0: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
62c0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
62d0: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
62e0: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
62f0: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
6300: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
6310: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6320: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
6330: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
6340: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
6350: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
6360: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
6370: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
6380: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
6390: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
63a0: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
63b0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
63c0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
63e0: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
63f0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29  3DbMallocRawNN()
6400: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6420: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6430: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  de */.  const To
6440: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20  ken *pToken,    
6450: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
6460: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
6470: 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  L */.  int dequo
6480: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
6490: 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74  * True to dequot
64a0: 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  e */.){.  Expr *
64b0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74  pNew;.  int nExt
64c0: 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  ra = 0;.  int iV
64d0: 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  alue = 0;..  ass
64e0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
64f0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
6500: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
6510: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
6520: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
6530: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
6540: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
6550: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
6560: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
6570: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
6580: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
6590: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
65a0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
65b0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
65c0: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
65d0: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
65e0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e  ){.    memset(pN
65f0: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ew, 0, sizeof(Ex
6600: 70 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pr));.    pNew->
6610: 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20  op = (u8)op;.   
6620: 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31   pNew->iAgg = -1
6630: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e  ;.    if( pToken
6640: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45   ){.      if( nE
6650: 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xtra==0 ){.     
6660: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
6670: 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
6680: 5f 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 70  _Leaf;.        p
6690: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
66a0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65  iValue;.      }e
66b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
66c0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
66d0: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
66e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
66f0: 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70  Token->z!=0 || p
6700: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20  Token->n==0 );. 
6710: 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65         if( pToke
6720: 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e  n->n ) memcpy(pN
6730: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54  ew->u.zToken, pT
6740: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
6750: 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  >n);.        pNe
6760: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b  w->u.zToken[pTok
6770: 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  en->n] = 0;.    
6780: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
6790: 26 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74  && sqlite3Isquot
67a0: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
67b0: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
67c0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54    if( pNew->u.zT
67d0: 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70  oken[0]=='"' ) p
67e0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
67f0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
6800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
6810: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
6820: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ken);.        }.
6830: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
6840: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
6850: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
6860: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
6870: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
6880: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
6890: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
68a0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
68b0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
68c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
68d0: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
68e0: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
68f0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
6900: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
6910: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6920: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
6930: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6940: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6950: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6960: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6970: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6980: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6990: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
69a0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
69b0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
69c0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
69d0: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
69e0: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
69f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6a00: 28 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75  (zToken);.  retu
6a10: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
6a20: 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20  loc(db, op, &x, 
6a30: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  0);.}../*.** Att
6a40: 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65  ach subtrees pLe
6a50: 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f  ft and pRight to
6a60: 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70   the Expr node p
6a70: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  Root..**.** If p
6a80: 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Root==NULL that 
6a90: 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d  means that a mem
6aa0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
6ab0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
6ac0: 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61  d..** In that ca
6ad0: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73  se, delete the s
6ae0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6af0: 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69  d pRight..*/.voi
6b00: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74  d sqlite3ExprAtt
6b10: 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73  achSubtrees(.  s
6b20: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78  qlite3 *db,.  Ex
6b30: 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70  pr *pRoot,.  Exp
6b40: 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72  r *pLeft,.  Expr
6b50: 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66   *pRight.){.  if
6b60: 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( pRoot==0 ){.  
6b70: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
6b80: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6b90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6ba0: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
6bb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6bc0: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
6bd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6be0: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
6bf0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68      pRoot->pRigh
6c00: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
6c10: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
6c20: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
6c30: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a   pRight->flags;.
6c40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
6c50: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  eft ){.      pRo
6c60: 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66  ot->pLeft = pLef
6c70: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c80: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c90: 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66  agate & pLeft->f
6ca0: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lags;.    }.    
6cb0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52  exprSetHeight(pR
6cc0: 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oot);.  }.}../*.
6cd0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45  ** Allocate an E
6ce0: 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a  xpr node which j
6cf0: 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20  oins as many as 
6d00: 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a  two subtrees..**
6d10: 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20  .** One or both 
6d20: 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20  of the subtrees 
6d30: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65  can be NULL.  Re
6d40: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6d50: 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70  o the new.** Exp
6d60: 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20  r node.  Or, if 
6d70: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
6d80: 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d  urs, set pParse-
6d90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6da0: 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73  d,.** free the s
6db0: 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75  ubtrees and retu
6dc0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72  rn NULL..*/.Expr
6dd0: 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a   *sqlite3PExpr(.
6de0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
6e00: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6e10: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
6e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6e30: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
6e40: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6e60: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
6e70: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 20 20   Expr *pRight   
6e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
6e90: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a  t operand */.){.
6ea0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28    Expr *p;.  if(
6eb0: 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70   op==TK_AND && p
6ec0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
6ed0: 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64  {.    /* Take ad
6ee0: 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74  vantage of short
6ef0: 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f  -circuit false o
6f00: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
6f10: 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73  AND */.    p = s
6f20: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
6f30: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c  arse->db, pLeft,
6f40: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
6f50: 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e{.    p = sqlit
6f60: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
6f70: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
6f80: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 69  of(Expr));.    i
6f90: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  f( p ){.      me
6fa0: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
6fb0: 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 20 20  f(Expr));.      
6fc0: 70 2d 3e 6f 70 20 3d 20 6f 70 20 26 20 54 4b 46  p->op = op & TKF
6fd0: 4c 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 70  LG_MASK;.      p
6fe0: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20  ->iAgg = -1;.   
6ff0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
7000: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
7010: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
7020: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
7030: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a    }.  if( p ) {.
7040: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7050: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
7060: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
7070: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
7080: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65  }../*.** Add pSe
7090: 6c 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72  lect to the Expr
70a0: 2e 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64  .x.pSelect field
70b0: 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20  .  Or, if pExpr 
70c0: 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20  is NULL (due.** 
70d0: 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  do a memory allo
70e0: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20  cation failure) 
70f0: 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
7100: 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a  pSelect object..
7110: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
7120: 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61  ExprAddSelect(Pa
7130: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
7140: 72 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74  r *pExpr, Select
7150: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66   *pSelect){.  if
7160: 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ( pExpr ){.    p
7170: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
7180: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45  = pSelect;.    E
7190: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
71a0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
71b0: 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b  ct|EP_Subquery);
71c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
71d0: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
71e0: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  s(pParse, pExpr)
71f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7200: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
7210: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7220: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
7230: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
7240: 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  e->db, pSelect);
7250: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
7260: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7270: 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
7280: 72 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20  r TRUE or FALSE 
7290: 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a  (respectively),.
72a0: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31  ** then return 1
72b0: 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  .  If one cannot
72c0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74   determine the t
72d0: 72 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68  ruth value of th
72e0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
72f0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
7300: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
7310: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
7320: 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20  ization.  If is 
7330: 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68  OK to return 0 h
7340: 65 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74  ere even if.** t
7350: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
7360: 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66  ally is always f
7370: 61 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61  alse or false (a
7380: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29   false negative)
7390: 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61  ..** But it is a
73a0: 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31   bug to return 1
73b0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
73c0: 6f 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69  on might have di
73d0: 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65  fferent.** boole
73e0: 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66  an values in dif
73f0: 66 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61  ferent circumsta
7400: 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f  nces (a false po
7410: 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e  sitive.).**.** N
7420: 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20  ote that if the 
7430: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61  expression is pa
7440: 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61  rt of conditiona
7450: 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20  l for a.** LEFT 
7460: 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61  JOIN, then we ca
7470: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61  nnot determine a
7480: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
7490: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
74a0: 20 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66   is it true or f
74b0: 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20  alse, so always 
74c0: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
74d0: 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61  tic int exprAlwa
74e0: 79 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b  ysTrue(Expr *p){
74f0: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
7500: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
7510: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
7520: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
7530: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
7540: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
7550: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
7560: 20 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a   return v!=0;.}.
7570: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
7580: 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20  lwaysFalse(Expr 
7590: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
75a0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
75b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
75c0: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
75d0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
75e0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
75f0: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
7600: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30  0;.  return v==0
7610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
7620: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
7630: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
7640: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
7650: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
7660: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
7670: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
7680: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
7690: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64  **.** If one sid
76a0: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
76b0: 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f  f the AND is kno
76c0: 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20  wn to be false, 
76d0: 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  then instead.** 
76e0: 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  of returning an 
76f0: 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  AND expression, 
7700: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
7710: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
7720: 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75  n with.** a valu
7730: 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45  e of false..*/.E
7740: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
7750: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
7760: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
7770: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
7780: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
7790: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
77a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
77b0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
77c0: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
77d0: 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
77e0: 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20  aysFalse(pLeft) 
77f0: 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  || exprAlwaysFal
7800: 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  se(pRight) ){.  
7810: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7820: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
7830: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7840: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
7850: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
7860: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
7870: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
7880: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
7890: 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  [0], 0);.  }else
78a0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
78b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
78c0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20  loc(db, TK_AND, 
78d0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
78e0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
78f0: 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70  rees(db, pNew, p
7900: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
7910: 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a     return pNew;.
7920: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
7930: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
7940: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
7950: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
7960: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
7970: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
7980: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63  *sqlite3ExprFunc
7990: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
79a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
79b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
79c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
79d0: 70 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 41  pList,      /* A
79e0: 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a  rgument list */.
79f0: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c    Token *pToken,
7a00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
7a10: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
7a20: 2a 2f 0a 20 20 69 6e 74 20 65 44 69 73 74 69 6e  */.  int eDistin
7a30: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 46  ct         /* SF
7a40: 5f 44 69 73 74 69 6e 63 74 20 6f 72 20 53 46 5f  _Distinct or SF_
7a50: 41 4c 4c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20  ALL or 0 */.){. 
7a60: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73   Expr *pNew;.  s
7a70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7a80: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
7a90: 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70  t( pToken );.  p
7aa0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
7ab0: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55  rAlloc(db, TK_FU
7ac0: 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20  NCTION, pToken, 
7ad0: 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  1);.  if( pNew==
7ae0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7af0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
7b00: 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76  b, pList); /* Av
7b10: 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  oid memory leak 
7b20: 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  when malloc fail
7b30: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
7b40: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
7b50: 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 45 78  st && pList->nEx
7b60: 70 72 20 3e 20 70 50 61 72 73 65 2d 3e 64 62 2d  pr > pParse->db-
7b70: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7b80: 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
7b90: 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  G] ){.    sqlite
7ba0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7bb0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75  , "too many argu
7bc0: 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69 6f  ments on functio
7bd0: 6e 20 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a  n %T", pToken);.
7be0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
7bf0: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45  ist = pList;.  E
7c00: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7c10: 4e 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29  New, EP_HasFunc)
7c20: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
7c30: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7c40: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
7c50: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
7c60: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
7c70: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
7c80: 3b 0a 20 20 69 66 28 20 65 44 69 73 74 69 6e 63  ;.  if( eDistinc
7c90: 74 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  t==SF_Distinct )
7ca0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
7cb0: 28 70 4e 65 77 2c 20 45 50 5f 44 69 73 74 69 6e  (pNew, EP_Distin
7cc0: 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ct);.  return pN
7cd0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
7ce0: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
7cf0: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
7d00: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
7d10: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
7d20: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
7d30: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
7d40: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
7d50: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
7d60: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
7d70: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
7d80: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
7d90: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
7da0: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
7db0: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
7dc0: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
7dd0: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
7de0: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
7df0: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
7e00: 6f 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76  ot too big to av
7e10: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
7e20: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
7e30: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
7e40: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
7e50: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
7e60: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
7e70: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7e80: 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61  orm ":aaa", "@aa
7e90: 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72  a", or "$aaa" ar
7ea0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
7eb0: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
7ec0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
7ed0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
7ee0: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
7ef0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
7f00: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
7f10: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
7f20: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
7f30: 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20  ential variable 
7f40: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
7f50: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
7f60: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
7f70: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
7f80: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7f90: 45 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20  Expr, u32 n){.  
7fa0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7fb0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73  arse->db;.  cons
7fc0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56  t char *z;.  ynV
7fd0: 61 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78  ar x;..  if( pEx
7fe0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
7ff0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
8000: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
8010: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  , EP_IntValue|EP
8020: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
8030: 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20  nOnly) );.  z = 
8040: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
8050: 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20  .  assert( z!=0 
8060: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30  );.  assert( z[0
8070: 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ]!=0 );.  assert
8080: 28 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74 65  ( n==(u32)sqlite
8090: 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a  3Strlen30(z) );.
80a0: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b    if( z[1]==0 ){
80b0: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
80c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22   of the form "?"
80d0: 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65  .  Assign the ne
80e0: 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  xt variable numb
80f0: 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  er */.    assert
8100: 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20  ( z[0]=='?' );. 
8110: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b     x = (ynVar)(+
8120: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
8130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
8140: 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20   doAdd = 0;.    
8150: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
8160: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
8170: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
8180: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
8190: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
81a0: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
81b0: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
81c0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
81d0: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
81e0: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20       int bOk;.  
81f0: 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20      if( n==2 ){ 
8200: 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49  /*OPTIMIZATION-I
8210: 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20  F-TRUE*/.       
8220: 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20   i = z[1]-'0';  
8230: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
8240: 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73  se of ?N for a s
8250: 69 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f  ingle digit N */
8260: 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31  .        bOk = 1
8270: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8280: 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d         bOk = 0==
8290: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a  sqlite3Atoi64(&z
82a0: 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51  [1], &i, n-1, SQ
82b0: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
82c0: 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
82d0: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
82e0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
82f0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8300: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
8310: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
8320: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
8330: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
8340: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
8350: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8360: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
8370: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
8380: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
8390: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
83a0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
83b0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
83c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
83d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
83e0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
83f0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
8400: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
8410: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
8420: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
8430: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
8440: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
8450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8460: 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20  x = (ynVar)i;.  
8470: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
8480: 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->nVar ){.      
8490: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
84a0: 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20   (int)x;.       
84b0: 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20   doAdd = 1;.    
84c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
84d0: 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d  te3VListNumToNam
84e0: 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  e(pParse->pVList
84f0: 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , x)==0 ){.     
8500: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8510: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
8520: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
8530: 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c  rds like ":aaa",
8540: 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61   "$aaa" or "@aaa
8550: 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61  ".  Reuse the sa
8560: 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  me variable.    
8570: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
8580: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
8590: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
85a0: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
85b0: 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  name.      ** ha
85c0: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
85d0: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
85e0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
85f0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f   number.      */
8600: 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61  .      x = (ynVa
8610: 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61  r)sqlite3VListNa
8620: 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e  meToNum(pParse->
8630: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20  pVList, z, n);. 
8640: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b       if( x==0 ){
8650: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e  .        x = (yn
8660: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
8670: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f  Var);.        do
8680: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
8690: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
86a0: 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50  oAdd ){.      pP
86b0: 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73  arse->pVList = s
86c0: 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64  qlite3VListAdd(d
86d0: 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  b, pParse->pVLis
86e0: 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20  t, z, n, x);.   
86f0: 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e   }.  }.  pExpr->
8700: 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69  iColumn = x;.  i
8710: 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  f( x>db->aLimit[
8720: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
8730: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
8740: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8750: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
8760: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
8770: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
8780: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
8790: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
87a0: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73  ssion tree..*/.s
87b0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
87c0: 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74  NLINE void sqlit
87d0: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73  e3ExprDeleteNN(s
87e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
87f0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
8800: 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e  p!=0 );.  /* San
8810: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
8820: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
8830: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
8840: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
8850: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
8860: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8870: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
8880: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
8890: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
88a0: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45 78  E_DEBUG.  if( Ex
88b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
88c0: 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78   EP_Leaf) && !Ex
88d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
88e0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
88f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8900: 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
8910: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
8920: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht==0 );.    ass
8930: 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63  ert( p->x.pSelec
8940: 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  t==0 );.  }.#end
8950: 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  if.  if( !ExprHa
8960: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50  sProperty(p, (EP
8970: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65  _TokenOnly|EP_Le
8980: 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  af)) ){.    /* T
8990: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
89a0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
89b0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
89c0: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
89d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
89e0: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
89f0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8a00: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
8a10: 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  & p->op!=TK_SELE
8a20: 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69  CT_COLUMN ) sqli
8a30: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8a40: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
8a50: 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
8a60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8a70: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62  3ExprDeleteNN(db
8a80: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
8a90: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
8aa0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8ab0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
8ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
8ad0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
8ae0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
8af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8b00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8b10: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  ete(db, p->x.pLi
8b20: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
8b30: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8b40: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
8b50: 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  d) ){.      sqli
8b60: 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28  te3WindowDelete(
8b70: 64 62 2c 20 70 2d 3e 70 57 69 6e 29 3b 0a 20 20  db, p->pWin);.  
8b80: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 45 78    }.  }.  if( Ex
8b90: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8ba0: 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20   EP_MemToken) ) 
8bb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8bc0: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
8bd0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
8be0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61  operty(p, EP_Sta
8bf0: 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  tic) ){.    sqli
8c00: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
8c10: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
8c20: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8c30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
8c40: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
8c50: 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  ) sqlite3ExprDel
8c60: 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a  eteNN(db, p);.}.
8c70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8c80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
8c90: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
8ca0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
8cb0: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73  tructure .** pas
8cc0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
8cd0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20   argument. This 
8ce0: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
8cf0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a   EXPR_FULLSIZE,.
8d00: 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  ** EXPR_REDUCEDS
8d10: 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45  IZE or EXPR_TOKE
8d20: 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74  NONLYSIZE..*/.st
8d30: 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74 72  atic int exprStr
8d40: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29  uctSize(Expr *p)
8d50: 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  {.  if( ExprHasP
8d60: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
8d70: 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  kenOnly) ) retur
8d80: 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  n EXPR_TOKENONLY
8d90: 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72  SIZE;.  if( Expr
8da0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8db0: 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65 74  P_Reduced) ) ret
8dc0: 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44  urn EXPR_REDUCED
8dd0: 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45  SIZE;.  return E
8de0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a  XPR_FULLSIZE;.}.
8df0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64  ./*.** The duped
8e00: 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74  Expr*Size() rout
8e10: 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72 6e  ines each return
8e20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
8e30: 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  ytes required.**
8e40: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79   to store a copy
8e50: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
8e60: 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  n or expression 
8e70: 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66 66  tree.  They diff
8e80: 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63  er in.** how muc
8e90: 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69 73  h of the tree is
8ea0: 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a   measured..**.**
8eb0: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 74       dupedExprSt
8ec0: 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20 53  ructSize()     S
8ed0: 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20  ize of only the 
8ee0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 0a  Expr structure .
8ef0: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
8f00: 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20 20  NodeSize()      
8f10: 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20   Size of Expr + 
8f20: 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a  space for token.
8f30: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
8f40: 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20 20  Size()          
8f50: 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20   Expr + token + 
8f60: 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e  subtree componen
8f70: 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ts.**.**********
8f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fc0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  *.**.** The dupe
8fd0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
8fe0: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
8ff0: 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52  ns two values OR
9000: 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a  -ed together:  .
9010: 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63 65  ** (1) the space
9020: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20   required for a 
9030: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
9040: 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20   structure only 
9050: 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20  and .** (2) the 
9060: 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61  EP_xxx flags tha
9070: 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20  t indicate what 
9080: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73 69  the structure si
9090: 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a  ze should be..**
90a0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
90b0: 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  es is always one
90c0: 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   of:.**.**      
90d0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a  EXPR_FULLSIZE.**
90e0: 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55 43        EXPR_REDUC
90f0: 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65  EDSIZE   | EP_Re
9100: 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58  duced.**      EX
9110: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
9120: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a   | EP_TokenOnly.
9130: 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
9140: 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
9150: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
9160: 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75  masking the retu
9170: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  rn value.** of t
9180: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
9190: 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61   0xfff.  The fla
91a0: 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  gs can be found 
91b0: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a  by masking the.*
91c0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  * return value w
91d0: 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ith EP_Reduced|E
91e0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a  P_TokenOnly..**.
91f0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74  ** Note that wit
9200: 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  h flags==EXPRDUP
9210: 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f  _REDUCE, this ro
9220: 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20  utines works on 
9230: 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e  full-size.** (un
9240: 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f 62  reduced) Expr ob
9250: 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f 72  jects as they or
9260: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73   originally cons
9270: 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70  tructed by the p
9280: 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67  arser..** During
9290: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
92a0: 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f  ysis, extra info
92b0: 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75  rmation is compu
92c0: 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e  ted and moved in
92d0: 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74  to.** later part
92e0: 73 20 6f 66 20 74 68 65 20 45 78 70 72 20 6f 62  s of the Expr ob
92f0: 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65 78  ject and that ex
9300: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
9310: 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70 65  might get choppe
9320: 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20  d.** off if the 
9330: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
9340: 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73  duced.  Note als
9350: 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
9360: 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61  ot work to.** ma
9370: 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52 45  ke an EXPRDUP_RE
9380: 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72  DUCE copy of a r
9390: 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f  educed expressio
93a0: 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c  n.  It is only l
93b0: 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63  egal.** to reduc
93c0: 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70  e a pristine exp
93d0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f  ression tree fro
93e0: 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54  m the parser.  T
93f0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
9400: 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70  n.** of dupedExp
9410: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f  rStructSize() co
9420: 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61  ntain multiple a
9430: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
9440: 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  ts that attempt.
9450: 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ** to enforce th
9460: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a  is constraint..*
9470: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
9480: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
9490: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
94a0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  ags){.  int nSiz
94b0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  e;.  assert( fla
94c0: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
94d0: 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29  CE || flags==0 )
94e0: 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c  ; /* Only one fl
94f0: 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64  ag value allowed
9500: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 58   */.  assert( EX
9510: 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66  PR_FULLSIZE<=0xf
9520: 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ff );.  assert( 
9530: 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65 64  (0xfff & (EP_Red
9540: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9550: 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  y))==0 );.  if( 
9560: 30 3d 3d 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f  0==flags || p->o
9570: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
9580: 55 4d 4e 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  UMN .#ifndef SQL
9590: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
95a0: 55 4e 43 0a 20 20 20 7c 7c 20 70 2d 3e 70 57 69  UNC.   || p->pWi
95b0: 6e 20 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  n .#endif.  ){. 
95c0: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
95d0: 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73  FULLSIZE;.  }els
95e0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  e{.    assert( !
95f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9600: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
9610: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
9620: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9630: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9640: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a  P_FromJoin) ); .
9650: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9660: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9670: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a  EP_MemToken) );.
9680: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9690: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
96a0: 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a  EP_NoReduce) );.
96b0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
96c0: 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   || p->x.pList )
96d0: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
96e0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
96f0: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20   | EP_Reduced;. 
9700: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9710: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
9720: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53  t==0 );.      nS
9730: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
9740: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
9750: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
9760: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
9770: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
9780: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
9790: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
97a0: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
97b0: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
97c0: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
97d0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
97e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
97f0: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
9800: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
9810: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
9820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9830: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
9840: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
9850: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
9860: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
9870: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
9880: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
9890: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
98a0: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
98b0: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
98c0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
98d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
98e0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b  (p->u.zToken)+1;
98f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f  .  }.  return RO
9900: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a  UND8(nByte);.}..
9910: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
9920: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9930: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
9940: 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ate a duplicate 
9950: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  of the .** expre
9960: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
9970: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
9980: 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  nt. The second a
9990: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
99a0: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mask containing 
99b0: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
99c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  s..**.** The val
99d0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  ue returned incl
99e0: 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72  udes space to cr
99f0: 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
9a00: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a  he Expr struct.*
9a10: 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65  * itself and the
9a20: 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64   buffer referred
9a30: 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54   to by Expr.u.zT
9a40: 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  oken, if any..**
9a50: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
9a60: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
9a70: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
9a80: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
9a90: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
9aa0: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
9ab0: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
9ac0: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
9ad0: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
9ae0: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
9af0: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
9b00: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
9b10: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
9b20: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
9b30: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
9b40: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
9b50: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
9b60: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
9b70: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
9b80: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
9b90: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
9ba0: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
9bb0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
9bc0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
9bd0: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
9be0: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
9bf0: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
9c00: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
9c10: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
9c20: 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70  ft, flags) + dup
9c30: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52  edExprSize(p->pR
9c40: 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ight, flags);.  
9c50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9c60: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
9c70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
9c80: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
9c90: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
9ca0: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
9cb0: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
9cc0: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
9cd0: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
9ce0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
9cf0: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
9d00: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
9d10: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
9d20: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
9d30: 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f  pies of p->u.zTo
9d40: 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69  ken.** (if appli
9d50: 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20  cable), and the 
9d60: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d  copies of the p-
9d70: 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52  >pLeft and p->pR
9d80: 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ight expressions
9d90: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66  ,.** if any. Bef
9da0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
9db0: 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20  pzBuffer is set 
9dc0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
9dd0: 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f  e past the.** po
9de0: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66  rtion of the buf
9df0: 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  fer copied into 
9e00: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
9e10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
9e20: 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65   *exprDup(sqlite
9e30: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
9e40: 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38  int dupFlags, u8
9e50: 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20   **pzBuffer){.  
9e60: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
9e70: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
9e80: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38  o return */.  u8
9e90: 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20   *zAlloc;       
9ea0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70      /* Memory sp
9eb0: 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ace from which t
9ec0: 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a  o build Expr obj
9ed0: 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61  ect */.  u32 sta
9ee0: 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  ticFlag;       /
9ef0: 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73  * EP_Static if s
9f00: 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65  pace not obtaine
9f10: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f  d from malloc */
9f20: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
9f30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9f40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75   );.  assert( du
9f50: 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70  pFlags==0 || dup
9f60: 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  Flags==EXPRDUP_R
9f70: 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72  EDUCE );.  asser
9f80: 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c  t( pzBuffer==0 |
9f90: 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52  | dupFlags==EXPR
9fa0: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20  DUP_REDUCE );.. 
9fb0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
9fc0: 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
9fd0: 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63  e new Expr struc
9fe0: 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ture. */.  if( p
9ff0: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a  zBuffer ){.    z
a000: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
a010: 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61  r;.    staticFla
a020: 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20  g = EP_Static;. 
a030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c   }else{.    zAll
a040: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
a050: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75  llocRawNN(db, du
a060: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64  pedExprSize(p, d
a070: 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73  upFlags));.    s
a080: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20  taticFlag = 0;. 
a090: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70   }.  pNew = (Exp
a0a0: 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69  r *)zAlloc;..  i
a0b0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f  f( pNew ){.    /
a0c0: 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74  * Set nNewSize t
a0d0: 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63  o the size alloc
a0e0: 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72  ated for the str
a0f0: 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
a100: 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77  o.    ** by pNew
a110: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
a120: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
a130: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
a140: 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f   or.    ** EXPR_
a150: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
a160: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
a170: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
a180: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
a190: 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20   ** by the copy 
a1a0: 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  of the p->u.zTok
a1b0: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e  en string (if an
a1c0: 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  y)..    */.    c
a1d0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53  onst unsigned nS
a1e0: 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65  tructSize = dupe
a1f0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
a200: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
a210: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77    const int nNew
a220: 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69  Size = nStructSi
a230: 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20  ze & 0xfff;.    
a240: 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  int nToken;.    
a250: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
a260: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
a270: 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f  lue) && p->u.zTo
a280: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f  ken ){.      nTo
a290: 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ken = sqlite3Str
a2a0: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
a2b0: 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73  n) + 1;.    }els
a2c0: 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  e{.      nToken 
a2d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
a2e0: 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20  f( dupFlags ){. 
a2f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
a300: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a310: 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29  EP_Reduced)==0 )
a320: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
a330: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69  Alloc, p, nNewSi
a340: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
a350: 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20        u32 nSize 
a360: 3d 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63  = (u32)exprStruc
a370: 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  tSize(p);.      
a380: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
a390: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , nSize);.      
a3a0: 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46  if( nSize<EXPR_F
a3b0: 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20  ULLSIZE ){ .    
a3c0: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c      memset(&zAll
a3d0: 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58  oc[nSize], 0, EX
a3e0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a  PR_FULLSIZE-nSiz
a3f0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a400: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
a410: 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50  e EP_Reduced, EP
a420: 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20  _TokenOnly, and 
a430: 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20  EP_Static flags 
a440: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a  appropriately. *
a450: 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  /.    pNew->flag
a460: 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65  s &= ~(EP_Reduce
a470: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  d|EP_TokenOnly|E
a480: 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54  P_Static|EP_MemT
a490: 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d  oken);.    pNew-
a4a0: 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63  >flags |= nStruc
a4b0: 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75  tSize & (EP_Redu
a4c0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
a4d0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  );.    pNew->fla
a4e0: 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67  gs |= staticFlag
a4f0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  ;..    /* Copy t
a500: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
a510: 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a  tring, if any. *
a520: 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e  /.    if( nToken
a530: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
a540: 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75  zToken = pNew->u
a550: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
a560: 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a  )&zAlloc[nNewSiz
a570: 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  e];.      memcpy
a580: 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54  (zToken, p->u.zT
a590: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
a5a0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d     }..    if( 0=
a5b0: 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77  =((p->flags|pNew
a5c0: 2d 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54  ->flags) & (EP_T
a5d0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66  okenOnly|EP_Leaf
a5e0: 29 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  )) ){.      /* F
a5f0: 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d  ill in the pNew-
a600: 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e  >x.pSelect or pN
a610: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62  ew->x.pList memb
a620: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  er. */.      if(
a630: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a640: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
a650: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
a660: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73  w->x.pSelect = s
a670: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
a680: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
a690: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a6a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a6b0: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
a6c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
a6d0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  tDup(db, p->x.pL
a6e0: 69 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  ist, dupFlags);.
a6f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a700: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e     /* Fill in pN
a710: 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e  ew->pLeft and pN
a720: 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20  ew->pRight. */. 
a730: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
a740: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
a750: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a760: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a  Only) ){.      z
a770: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
a780: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75  prNodeSize(p, du
a790: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  pFlags);.      i
a7a0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a7b0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b  rty(pNew, EP_Tok
a7c0: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20  enOnly|EP_Leaf) 
a7d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
a7e0: 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66  >pLeft = p->pLef
a7f0: 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ?.            
a800: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75            exprDu
a810: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
a820: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
a830: 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20  &zAlloc) : 0;.  
a840: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
a850: 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f  ht = p->pRight ?
a860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a870: 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28          exprDup(
a880: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
a890: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a8a0: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a8b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a8c0: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  zBuffer ){.     
a8d0: 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a     *pzBuffer = z
a8e0: 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20  Alloc;.      }. 
a8f0: 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65     }else{.#ifnde
a900: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
a910: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69  NDOWFUNC.      i
a920: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a930: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
a940: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29  |EP_TokenOnly) )
a950: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a960: 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  pWin = 0;.      
a970: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
a980: 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 73 71 6c 69  New->pWin = sqli
a990: 74 65 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c  te3WindowDup(db,
a9a0: 20 70 4e 65 77 2c 20 70 2d 3e 70 57 69 6e 29 3b   pNew, p->pWin);
a9b0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  .      }.#endif 
a9c0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
a9d0: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20  INDOWFUNC */.   
a9e0: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
a9f0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
aa00: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
aa10: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
aa20: 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  pNew->op==TK_SEL
aa30: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  ECT_COLUMN ){.  
aa40: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
aa50: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a  eft = p->pLeft;.
aa60: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
aa70: 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  ( p->iColumn==0 
aa80: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
aa90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
aaa0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
aab0: 30 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d  0  || p->pRight=
aac0: 3d 70 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20  =p->pLeft );.   
aad0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aae0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
aaf0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
ab00: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c  up(db, p->pLeft,
ab10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
ab20: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
ab30: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
ab40: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
ab50: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ht, 0);.      }.
ab60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
ab70: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
ab80: 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74  * Create and ret
ab90: 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20  urn a deep copy 
aba0: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61  of the object pa
abb0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
abc0: 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  nd .** argument.
abd0: 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69   If an OOM condi
abe0: 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65  tion is encounte
abf0: 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  red, NULL is ret
ac00: 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  urned.** and the
ac10: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ac20: 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23  d flag set..*/.#
ac30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ac40: 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69  IT_CTE.static Wi
ac50: 74 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69  th *withDup(sqli
ac60: 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
ac70: 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20  ){.  With *pRet 
ac80: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
ac90: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
aca0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a  sizeof(*p) + siz
acb0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
acc0: 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20  p->nCte-1);.    
acd0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  pRet = sqlite3Db
ace0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
acf0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
ad00: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Ret ){.      int
ad10: 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   i;.      pRet->
ad20: 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a  nCte = p->nCte;.
ad30: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ad40: 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
ad50: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
ad60: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
ad70: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
ad80: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  , p->a[i].pSelec
ad90: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
ada0: 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20  Ret->a[i].pCols 
adb0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
adc0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
add0: 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20  .pCols, 0);.    
ade0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a      pRet->a[i].z
adf0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
ae00: 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  StrDup(db, p->a[
ae10: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
ae20: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
ae30: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
ae40: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74  lse.# define wit
ae50: 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64  hDup(x,y) 0.#end
ae60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
ae70: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
ae80: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
ae90: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
aea0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
aeb0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
aec0: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
aed0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
aee0: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
aef0: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
af00: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
af10: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
af20: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
af30: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
af40: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
af50: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
af60: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
af70: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
af80: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
af90: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
afa0: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
afb0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
afc0: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
afd0: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
afe0: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
aff0: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
b000: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
b010: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
b020: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
b030: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
b040: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
b050: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
b060: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
b070: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
b080: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
b090: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
b0a0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
b0b0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
b0c0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
b0d0: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
b0e0: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
b0f0: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
b100: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
b110: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
b120: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
b130: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
b140: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
b150: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
b160: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
b170: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b180: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
b190: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
b1a0: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
b1b0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
b1c0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
b1d0: 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
b1e0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
b1f0: 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75  REDUCE );.  retu
b200: 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70 28 64  rn p ? exprDup(d
b210: 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20  b, p, flags, 0) 
b220: 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20  : 0;.}.ExprList 
b230: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
b240: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b250: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
b260: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
b270: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
b280: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
b290: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
b2a0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
b2b0: 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53 65 6c   Expr *pPriorSel
b2c0: 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73  ectCol = 0;.  as
b2d0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
b2e0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b2f0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
b300: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b310: 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65 33 44  wNN(db, sqlite3D
b320: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
b330: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  p));.  if( pNew=
b340: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b350: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
b360: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d  ->nExpr;.  pItem
b370: 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f   = pNew->a;.  pO
b380: 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20  ldItem = p->a;. 
b390: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b3a0: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
b3b0: 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b  ++, pOldItem++){
b3c0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45  .    Expr *pOldE
b3d0: 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  xpr = pOldItem->
b3e0: 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
b3f0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70  *pNewExpr;.    p
b400: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Item->pExpr = sq
b410: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b420: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
b430: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45  );.    if( pOldE
b440: 78 70 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c  xpr .     && pOl
b450: 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  dExpr->op==TK_SE
b460: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  LECT_COLUMN.    
b470: 20 26 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20   && (pNewExpr = 
b480: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30  pItem->pExpr)!=0
b490: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
b4a0: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d  ssert( pNewExpr-
b4b0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69  >iColumn==0 || i
b4c0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
b4d0: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
b4e0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
b4f0: 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72  assert( pOldExpr
b500: 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70  ->pLeft==pOldExp
b510: 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20  r->pRight );.   
b520: 20 20 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63       pPriorSelec
b530: 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d  tCol = pNewExpr-
b540: 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70  >pLeft = pNewExp
b550: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
b560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b570: 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
b580: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b590: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d  Item[-1].pExpr!=
b5a0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
b5b0: 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69  ert( pNewExpr->i
b5c0: 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31  Column==pItem[-1
b5d0: 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
b5e0: 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  +1 );.        as
b5f0: 73 65 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65  sert( pPriorSele
b600: 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d  ctCol==pItem[-1]
b610: 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b  .pExpr->pLeft );
b620: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45 78 70  .        pNewExp
b630: 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f  r->pLeft = pPrio
b640: 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20  rSelectCol;.    
b650: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49    }.    }.    pI
b660: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
b670: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b680: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
b690: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
b6a0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
b6b0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b6c0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
b6d0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
b6e0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
b6f0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
b700: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
b710: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
b720: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
b730: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
b740: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
b750: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 6f   = pOldItem->bSo
b760: 72 74 65 72 52 65 66 3b 0a 20 20 20 20 70 49 74  rterRef;.    pIt
b770: 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d  em->u = pOldItem
b780: 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ->u;.  }.  retur
b790: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
b7a0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
b7b0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
b7c0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
b7d0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
b7e0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
b7f0: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
b800: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
b810: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
b820: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
b830: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
b840: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
b850: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
b860: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
b870: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
b880: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
b890: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b8a0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
b8b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b8c0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
b8d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b8e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
b8f0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
b900: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
b910: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
b920: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
b930: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
b940: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
b950: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64  yte;.  assert( d
b960: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b970: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b980: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
b990: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
b9a0: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
b9b0: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
b9c0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
b9d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b9e0: 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29  awNN(db, nByte )
b9f0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
ba00: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
ba10: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
ba20: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
ba30: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
ba40: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
ba50: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
ba60: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
ba70: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
ba80: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
ba90: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
baa0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
bab0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
bac0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63     pNewItem->pSc
bad0: 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  hema = pOldItem-
bae0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e  >pSchema;.    pN
baf0: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
bb00: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
bb10: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bb20: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
bb30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
bb40: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
bb50: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bb60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
bb70: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
bb80: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
bb90: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
bba0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
bbb0: 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49  Item->fg = pOldI
bbc0: 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65  tem->fg;.    pNe
bbd0: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
bbe0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
bbf0: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
bc00: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
bc10: 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69  pOldItem->addrFi
bc20: 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49  llSub;.    pNewI
bc30: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
bc40: 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65   pOldItem->regRe
bc50: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e  turn;.    if( pN
bc60: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64  ewItem->fg.isInd
bc70: 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20  exedBy ){.      
bc80: 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pNewItem->u1.zIn
bc90: 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
bca0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
bcb0: 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ldItem->u1.zInde
bcc0: 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  xedBy);.    }.  
bcd0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49    pNewItem->pIBI
bce0: 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ndex = pOldItem-
bcf0: 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69  >pIBIndex;.    i
bd00: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
bd10: 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
bd20: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e     pNewItem->u1.
bd30: 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20  pFuncArg = .    
bd40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
bd50: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  rListDup(db, pOl
bd60: 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  dItem->u1.pFuncA
bd70: 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rg, flags);.    
bd80: 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  }.    pTab = pNe
bd90: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
bda0: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
bdb0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
bdc0: 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
bdd0: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f++;.    }.    p
bde0: 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  NewItem->pSelect
bdf0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
be00: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
be10: 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73  ->pSelect, flags
be20: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
be30: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
be40: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
be50: 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b  em->pOn, flags);
be60: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
be70: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
be80: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  dListDup(db, pOl
be90: 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  dItem->pUsing);.
bea0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f      pNewItem->co
beb0: 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lUsed = pOldItem
bec0: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20  ->colUsed;.  }. 
bed0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
bee0: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
bef0: 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  dListDup(sqlite3
bf00: 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29   *db, IdList *p)
bf10: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
bf20: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
bf30: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
bf40: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
bf50: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
bf60: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
bf70: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
bf80: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
bf90: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
bfa0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
bfb0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
bfc0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
bfd0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e  locRawNN(db, p->
bfe0: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
bff0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
c000: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
c010: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
c020: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
c030: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
c040: 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61 75   Note that becau
c050: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
c060: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  he allocation fo
c070: 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a  r p->a[] is not.
c080: 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79    ** necessarily
c090: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c   a power of two,
c0a0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
c0b0: 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62  pend() may not b
c0c0: 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e  e called.  ** on
c0d0: 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
c0e0: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20 66  reated by this f
c0f0: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  unction. */.  fo
c100: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
c110: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
c120: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c130: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
c140: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
c150: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c160: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
c170: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
c180: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
c190: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c1a0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
c1b0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
c1c0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
c1d0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
c1e0: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
c1f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
c200: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
c210: 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74 20  lect *pDup, int 
c220: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
c230: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53 65   *pRet = 0;.  Se
c240: 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b  lect *pNext = 0;
c250: 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d  .  Select **pp =
c260: 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63 74   &pRet;.  Select
c270: 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
c280: 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70  db!=0 );.  for(p
c290: 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70  =pDup; p; p=p->p
c2a0: 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
c2b0: 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  ct *pNew = sqlit
c2c0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
c2d0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
c2e0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
c2f0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
c300: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
c310: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c320: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
c330: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c340: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
c350: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
c360: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
c370: 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65      pNew->pWhere
c380: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
c390: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
c3a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c3b0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
c3c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c3d0: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
c3e0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c3f0: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
c400: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c410: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
c420: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c430: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
c440: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c450: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
c460: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c470: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
c480: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  pNew->pNext = pN
c490: 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ext;.    pNew->p
c4a0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
c4b0: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
c4c0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c4d0: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67   p->pLimit, flag
c4e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c  s);.    pNew->iL
c4f0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
c500: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
c510: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  .    pNew->selFl
c520: 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
c530: 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65  s & ~SF_UsesEphe
c540: 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d  meral;.    pNew-
c550: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
c560: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
c570: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
c580: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
c590: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
c5a0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
c5b0: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77   pNew->pWith = w
c5c0: 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  ithDup(db, p->pW
c5d0: 69 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ith);.#ifndef SQ
c5e0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
c5f0: 46 55 4e 43 0a 20 20 20 20 70 4e 65 77 2d 3e 70  FUNC.    pNew->p
c600: 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Win = 0;.    pNe
c610: 77 2d 3e 70 57 69 6e 44 65 66 6e 20 3d 20 73 71  w->pWinDefn = sq
c620: 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44  lite3WindowListD
c630: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 6e 44 65  up(db, p->pWinDe
c640: 66 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  fn);.#endif.    
c650: 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d 20 70 2d  pNew->selId = p-
c660: 3e 73 65 6c 49 64 3b 0a 20 20 20 20 2a 70 70 20  >selId;.    *pp 
c670: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 70 20 3d  = pNew;.    pp =
c680: 20 26 70 4e 65 77 2d 3e 70 50 72 69 6f 72 3b 0a   &pNew->pPrior;.
c690: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 4e 65 77      pNext = pNew
c6a0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
c6b0: 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65  pRet;.}.#else.Se
c6c0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
c6d0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
c6e0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
c6f0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
c700: 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72  ert( p==0 );.  r
c710: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
c720: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
c730: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
c740: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
c750: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
c760: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
c770: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
c780: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
c790: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
c7a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74  .**.** The pList
c7b0: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
c7c0: 65 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72  e either NULL or
c7d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
c7e0: 20 45 78 70 72 4c 69 73 74 0a 2a 2a 20 6f 62 74   ExprList.** obt
c7f0: 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 70 72 69  ained from a pri
c800: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
c810: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
c820: 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ().  This routin
c830: 65 0a 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20  e.** may not be 
c840: 75 73 65 64 20 77 69 74 68 20 61 6e 20 45 78 70  used with an Exp
c850: 72 4c 69 73 74 20 6f 62 74 61 69 6e 65 64 20 66  rList obtained f
c860: 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  rom sqlite3ExprL
c870: 69 73 74 44 75 70 28 29 2e 0a 2a 2a 20 52 65 61  istDup()..** Rea
c880: 73 6f 6e 3a 20 20 54 68 69 73 20 72 6f 75 74 69  son:  This routi
c890: 6e 65 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ne assumes that 
c8a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
c8b0: 6f 74 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b  ots in pList->a[
c8c0: 5d 0a 2a 2a 20 69 73 20 61 20 70 6f 77 65 72 20  ].** is a power 
c8d0: 6f 66 20 74 77 6f 2e 20 20 54 68 61 74 20 69 73  of two.  That is
c8e0: 20 74 72 75 65 20 66 6f 72 20 73 71 6c 69 74 65   true for sqlite
c8f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
c900: 29 20 72 65 74 75 72 6e 73 0a 2a 2a 20 62 75 74  ) returns.** but
c910: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
c920: 69 6c 79 20 74 72 75 65 20 66 72 6f 6d 20 74 68  ily true from th
c930: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
c940: 66 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  f sqlite3ExprLis
c950: 74 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  tDup()..**.** If
c960: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
c970: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
c980: 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69  s, the entire li
c990: 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a  st is freed and.
c9a0: 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
c9b0: 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c  ned.  If non-NUL
c9c0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  L is returned, t
c9d0: 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
c9e0: 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65  teed.** that the
c9f0: 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73   new entry was s
ca00: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65  uccessfully appe
ca10: 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  nded..*/.ExprLis
ca20: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
ca30: 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73  stAppend(.  Pars
ca40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ca50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
ca60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
ca70: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
ca80: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
ca90: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
caa0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
cab0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
cac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
cad0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
cae0: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
caf0: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
cb00: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
cb10: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
cb20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
cb30: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
cb40: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
cb50: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
cb60: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
cb70: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
cb80: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
cb90: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
cba0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
cbb0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
cbc0: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45   }.    pList->nE
cbd0: 78 70 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  xpr = 0;.  }else
cbe0: 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78   if( (pList->nEx
cbf0: 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78  pr & (pList->nEx
cc00: 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pr-1))==0 ){.   
cc10: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b   ExprList *pNew;
cc20: 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
cc30: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
cc40: 20 70 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20   pList, .       
cc50: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c        sizeof(*pL
cc60: 69 73 74 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e  ist)+(2*pList->n
cc70: 45 78 70 72 20 2d 20 31 29 2a 73 69 7a 65 6f 66  Expr - 1)*sizeof
cc80: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
cc90: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
cca0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
ccb0: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
ccc0: 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pList = pNew;.  
ccd0: 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
cce0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
ccf0: 70 72 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28  pr++];.  assert(
cd00: 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74   offsetof(struct
cd10: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a   ExprList_item,z
cd20: 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49  Name)==sizeof(pI
cd30: 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20  tem->pExpr) );. 
cd40: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f   assert( offseto
cd50: 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73  f(struct ExprLis
cd60: 74 5f 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30  t_item,pExpr)==0
cd70: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 49   );.  memset(&pI
cd80: 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a  tem->zName,0,siz
cd90: 65 6f 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73  eof(*pItem)-offs
cda0: 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72  etof(struct Expr
cdb0: 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29  List_item,zName)
cdc0: 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  );.  pItem->pExp
cdd0: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74  r = pExpr;.  ret
cde0: 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d  urn pList;..no_m
cdf0: 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76  em:     .  /* Av
ce00: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
ce10: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73  ry if malloc has
ce20: 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71   failed. */.  sq
ce30: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
ce40: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
ce50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
ce60: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
ce70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
ce80: 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e  *.** pColumns an
ce90: 64 20 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76  d pExpr form a v
cea0: 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74  ector assignment
ceb0: 20 77 68 69 63 68 20 69 73 20 70 61 72 74 20 6f   which is part o
cec0: 66 20 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61  f the SET.** cla
ced0: 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45  use of an UPDATE
cee0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b   statement.  Lik
cef0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
cf00: 20 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28       (a,b,c) = (
cf10: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
cf20: 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c  3).** Or:    (a,
cf30: 62 2c 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78  b,c) = (SELECT x
cf40: 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a  ,y,z FROM ....).
cf50: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74  **.** For each t
cf60: 65 72 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f  erm of the vecto
cf70: 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70  r assignment, ap
cf80: 70 65 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73  pend new entries
cf90: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   to the.** expre
cfa0: 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74  ssion list pList
cfb0: 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f  .  In the case o
cfc0: 66 20 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20  f a subquery on 
cfd0: 74 68 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a  the RHS, append.
cfe0: 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  ** TK_SELECT_COL
cff0: 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  UMN expressions.
d000: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
d010: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
d020: 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72  endVector(.  Par
d030: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d040: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
d050: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
d060: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
d070: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
d080: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
d090: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
d0a0: 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d    IdList *pColum
d0b0: 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ns,      /* List
d0c0: 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53   of names of LHS
d0d0: 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65   of the assignme
d0e0: 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  nt */.  Expr *pE
d0f0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
d100: 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65 73 73  * Vector express
d110: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
d120: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
d130: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  L */.){.  sqlite
d140: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d150: 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  db;.  int n;.  i
d160: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72  nt i;.  int iFir
d170: 73 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  st = pList ? pLi
d180: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
d190: 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e   /* pColumns can
d1a0: 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75   only be NULL du
d1b0: 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20  e to an OOM but 
d1c0: 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  an OOM will caus
d1d0: 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70  e an.  ** exit p
d1e0: 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
d1f0: 74 69 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b  tine being invok
d200: 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  ed */.  if( NEVE
d210: 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29  R(pColumns==0) )
d220: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
d230: 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  end_error;.  if(
d240: 20 70 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f   pExpr==0 ) goto
d250: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
d260: 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  rror;..  /* If t
d270: 68 65 20 52 48 53 20 69 73 20 61 20 76 65 63 74  he RHS is a vect
d280: 6f 72 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  or, then we can 
d290: 69 6d 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63  immediately chec
d2a0: 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20  k to see that . 
d2b0: 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20   ** the size of 
d2c0: 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20  the RHS and LHS 
d2d0: 6d 61 74 63 68 2e 20 20 42 75 74 20 69 66 20 74  match.  But if t
d2e0: 68 65 20 52 48 53 20 69 73 20 61 20 53 45 4c 45  he RHS is a SELE
d2f0: 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61  CT, .  ** wildca
d300: 72 64 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65  rds ("*") in the
d310: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
d320: 68 65 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62  he SELECT must b
d330: 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72  e expanded befor
d340: 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f  e.  ** we can do
d350: 20 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c   the size check,
d360: 20 73 6f 20 64 65 66 65 72 20 74 68 65 20 73 69   so defer the si
d370: 7a 65 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63  ze check until c
d380: 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a  ode generation..
d390: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
d3a0: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op!=TK_SELECT 
d3b0: 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64  && pColumns->nId
d3c0: 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72  !=(n=sqlite3Expr
d3d0: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
d3e0: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
d3f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d400: 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73  , "%d columns as
d410: 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73  signed %d values
d420: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d430: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d         pColumns-
d440: 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f  >nId, n);.    go
d450: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
d460: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66  _error;.  }..  f
d470: 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d  or(i=0; i<pColum
d480: 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  ns->nId; i++){. 
d490: 20 20 20 45 78 70 72 20 2a 70 53 75 62 45 78 70     Expr *pSubExp
d4a0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46  r = sqlite3ExprF
d4b0: 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50  orVectorField(pP
d4c0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b  arse, pExpr, i);
d4d0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
d4e0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
d4f0: 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  nd(pParse, pList
d500: 2c 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20  , pSubExpr);.   
d510: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
d520: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
d530: 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74  t->nExpr==iFirst
d540: 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c  +i+1 );.      pL
d550: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
d560: 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70  xpr-1].zName = p
d570: 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e  Columns->a[i].zN
d580: 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75  ame;.      pColu
d590: 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  mns->a[i].zName 
d5a0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
d5b0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
d5c0: 63 46 61 69 6c 65 64 20 26 26 20 70 45 78 70 72  cFailed && pExpr
d5d0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
d5e0: 26 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74 21  && ALWAYS(pList!
d5f0: 3d 30 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  =0) ){.    Expr 
d600: 2a 70 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d  *pFirst = pList-
d610: 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72  >a[iFirst].pExpr
d620: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
d630: 69 72 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  irst!=0 );.    a
d640: 73 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f  ssert( pFirst->o
d650: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
d660: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20  UMN );.     .   
d670: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45   /* Store the SE
d680: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
d690: 6e 20 70 52 69 67 68 74 20 73 6f 20 69 74 20 77  n pRight so it w
d6a0: 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77  ill be deleted w
d6b0: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  hen.    ** sqlit
d6c0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
d6d0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a  () is called */.
d6e0: 20 20 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67      pFirst->pRig
d6f0: 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  ht = pExpr;.    
d700: 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20  pExpr = 0;..    
d710: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
d720: 73 69 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20  size of the LHS 
d730: 69 6e 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61  in iTable so tha
d740: 74 20 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74  t we can check t
d750: 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  hat.    ** the R
d760: 48 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73  HS and LHS sizes
d770: 20 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f   match during co
d780: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a  de generation. *
d790: 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54  /.    pFirst->iT
d7a0: 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d  able = pColumns-
d7b0: 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f  >nId;.  }..vecto
d7c0: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a  r_append_error:.
d7d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
d7e0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
d7f0: 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
d800: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d  elete(db, pColum
d810: 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  ns);.  return pL
d820: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ist;.}../*.** Se
d830: 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  t the sort order
d840: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c   for the last el
d850: 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76  ement on the giv
d860: 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a  en ExprList..*/.
d870: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
d880: 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72  ListSetSortOrder
d890: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
d8a0: 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20  t iSortOrder){. 
d8b0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
d8c0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51  rn;.  assert( SQ
d8d0: 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45  LITE_SO_UNDEFINE
d8e0: 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  D<0 && SQLITE_SO
d8f0: 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54  _ASC>=0 && SQLIT
d900: 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20  E_SO_DESC>0 );. 
d910: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70   assert( p->nExp
d920: 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f  r>0 );.  if( iSo
d930: 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20  rtOrder<0 ){.   
d940: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d   assert( p->a[p-
d950: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
d960: 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  der==SQLITE_SO_A
d970: 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  SC );.    return
d980: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e  ;.  }.  p->a[p->
d990: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
d9a0: 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72  er = (u8)iSortOr
d9b0: 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  der;.}../*.** Se
d9c0: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
d9d0: 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74  [].zName element
d9e0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
d9f0: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
da00: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
da10: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
da20: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
da30: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
da40: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
da50: 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20  ut pName should 
da60: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
da70: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
da80: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
da90: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
daa0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
dab0: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
dac0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
dad0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20  rListSetName(.  
dae0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
daf0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
db00: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
db10: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
db20: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
db30: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
db40: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54  the span. */.  T
db50: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
db60: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74         /* Name t
db70: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
db80: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
db90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
dba0: 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d  to cause the nam
dbb0: 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64  e to be dequoted
dbc0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
dbd0: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61   pList!=0 || pPa
dbe0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
dbf0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
dc00: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
dc10: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
dc20: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
dc30: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
dc40: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49  Expr>0 );.    pI
dc50: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
dc60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
dc70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
dc80: 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a  em->zName==0 );.
dc90: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
dca0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
dcb0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
dcc0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
dcd0: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71  >n);.    if( deq
dce0: 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65  uote ) sqlite3De
dcf0: 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  quote(pItem->zNa
dd00: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  me);.  }.}../*.*
dd10: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
dd20: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65  st.a[].zSpan ele
dd30: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
dd40: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
dd50: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
dd60: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
dd70: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
dd80: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
dd90: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
dda0: 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f  .  But pSpan sho
ddb0: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
ddc0: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
ddd0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
dde0: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
ddf0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
de00: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
de10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
de20: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
de30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
de40: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
de50: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
de60: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
de70: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
de80: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
de90: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
dea0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
deb0: 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74  Start,     /* St
dec0: 61 72 74 20 6f 66 20 74 68 65 20 73 70 61 6e 20  art of the span 
ded0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
dee0: 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20  *zEnd        /* 
def0: 45 6e 64 20 6f 66 20 74 68 65 20 73 70 61 6e 20  End of the span 
df00: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
df10: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
df20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
df30: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
df40: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
df50: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
df60: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
df70: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
df80: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
df90: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
dfa0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
dfb0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c  xpr>0 );.    sql
dfc0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
dfd0: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
dfe0: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
dff0: 20 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75   sqlite3DbSpanDu
e000: 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45  p(db, zStart, zE
e010: 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nd);.  }.}../*.*
e020: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
e030: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
e040: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
e050: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
e060: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
e070: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
e080: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
e090: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e0a0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
e0b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
e0c0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e0d0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e0e0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
e0f0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
e100: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
e110: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
e120: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
e130: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
e140: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
e150: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
e160: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
e170: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
e180: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
e190: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
e1a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e1b0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
e1c0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
e1d0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
e1e0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
e1f0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
e200: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion list..*/.sta
e210: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
e220: 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73  INE void exprLis
e230: 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  tDeleteNN(sqlite
e240: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
e250: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
e260: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
e270: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
e280: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
e290: 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73    pList->a;.  as
e2a0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
e2b0: 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pr>0 );.  do{.  
e2c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
e2d0: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
e2e0: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
e2f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
e300: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
e310: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e320: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
e330: 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20  .    pItem++;.  
e340: 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b  }while( --i>0 );
e350: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
e360: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
e370: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e380: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
e390: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
e3a0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28  t *pList){.  if(
e3b0: 20 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73   pList ) exprLis
e3c0: 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c  tDeleteNN(db, pL
e3d0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
e3e0: 65 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73  eturn the bitwis
e3f0: 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72  e-OR of all Expr
e400: 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e  .flags fields in
e410: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78   the given.** Ex
e420: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73  prList..*/.u32 s
e430: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
e440: 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69  ags(const ExprLi
e450: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
e460: 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30  t i;.  u32 m = 0
e470: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
e480: 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  t!=0 );.  for(i=
e490: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
e4a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 45 78  r; i++){.     Ex
e4b0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
e4c0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
e4d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
e4e0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 6d 20 7c  r!=0 );.     m |
e4f0: 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a  = pExpr->flags;.
e500: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
e510: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
e520: 20 61 20 53 45 4c 45 43 54 2d 6e 6f 64 65 20 63   a SELECT-node c
e530: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
e540: 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65  expression walke
e550: 72 20 74 68 61 74 0a 2a 2a 20 61 6c 77 61 79 73  r that.** always
e560: 20 22 66 61 69 6c 73 22 2e 20 20 42 79 20 22 66   "fails".  By "f
e570: 61 69 6c 22 20 69 6e 20 74 68 69 73 20 63 61 73  ail" in this cas
e580: 65 2c 20 77 65 20 6d 65 61 6e 20 73 65 74 0a 2a  e, we mean set.*
e590: 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  * pWalker->eCode
e5a0: 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 61 62 6f   to zero and abo
e5b0: 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  rt..**.** This c
e5c0: 61 6c 6c 62 61 63 6b 20 69 73 20 75 73 65 64 20  allback is used 
e5d0: 62 79 20 6d 75 6c 74 69 70 6c 65 20 65 78 70 72  by multiple expr
e5e0: 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a  ession walkers..
e5f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
e600: 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28 57 61 6c  lectWalkFail(Wal
e610: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
e620: 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  lect *NotUsed){.
e630: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
e640: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70  ER(NotUsed);.  p
e650: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
e660: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
e670: 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Abort;.}../*.** 
e680: 49 66 20 74 68 65 20 69 6e 70 75 74 20 65 78 70  If the input exp
e690: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 49 44  ression is an ID
e6a0: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 22   with the name "
e6b0: 74 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22  true" or "false"
e6c0: 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  .** then convert
e6d0: 20 69 74 20 69 6e 74 6f 20 61 6e 20 54 4b 5f 54   it into an TK_T
e6e0: 52 55 45 46 41 4c 53 45 20 74 65 72 6d 2e 20 20  RUEFALSE term.  
e6f0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
e700: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 76 65 72  if.** the conver
e710: 73 69 6f 6e 20 68 61 70 70 65 6e 65 64 2c 20 61  sion happened, a
e720: 6e 64 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  nd zero if the e
e730: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 61  xpression is una
e740: 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ltered..*/.int s
e750: 71 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72  qlite3ExprIdToTr
e760: 75 65 46 61 6c 73 65 28 45 78 70 72 20 2a 70 45  ueFalse(Expr *pE
e770: 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  xpr){.  assert( 
e780: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pExpr->op==TK_ID
e790: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
e7a0: 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 69 66  K_STRING );.  if
e7b0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
e7c0: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
e7d0: 2c 20 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20  , "true")==0.   
e7e0: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
e7f0: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
e800: 6e 2c 20 22 66 61 6c 73 65 22 29 3d 3d 30 0a 20  n, "false")==0. 
e810: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   ){.    pExpr->o
e820: 70 20 3d 20 54 4b 5f 54 52 55 45 46 41 4c 53 45  p = TK_TRUEFALSE
e830: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
e840: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
e850: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
e860: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20  ument must be a 
e870: 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 45 78 70  TK_TRUEFALSE Exp
e880: 72 20 6e 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  r node.  Return 
e890: 31 20 69 66 20 69 74 20 69 73 20 54 52 55 45 0a  1 if it is TRUE.
e8a0: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
e8b0: 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e 74 20  s FALSE..*/.int 
e8c0: 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
e8d0: 56 61 6c 75 65 28 63 6f 6e 73 74 20 45 78 70 72  Value(const Expr
e8e0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65   *pExpr){.  asse
e8f0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
e900: 4b 5f 54 52 55 45 46 41 4c 53 45 20 29 3b 0a 20  K_TRUEFALSE );. 
e910: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e920: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
e930: 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75 65 22 29 3d  .zToken,"true")=
e940: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
e950: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
e960: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 66 61 6c  r->u.zToken,"fal
e970: 73 65 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  se")==0 );.  ret
e980: 75 72 6e 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  urn pExpr->u.zTo
e990: 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a 0a 0a 2f  ken[4]==0;.}.../
e9a0: 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
e9b0: 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63  nes are Walker c
e9c0: 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f  allbacks used to
e9d0: 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f   check expressio
e9e0: 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20  ns to.** see if 
e9f0: 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61  they are "consta
ea00: 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66  nt" for some def
ea10: 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74  inition of const
ea20: 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c  ant.  The.** Wal
ea30: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
ea40: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74  determines the t
ea50: 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74  ype of "constant
ea60: 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  " we are looking
ea70: 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  .** for..**.** T
ea80: 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f  hese callback ro
ea90: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
eaa0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
eab0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
eac0: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
ead0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  rIsConstant()   
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
eaf0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31  Walker->eCode==1
eb00: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
eb10: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
eb20: 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20 20  Join()          
eb30: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
eb40: 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =2.**     sqlite
eb50: 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
eb60: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
eb70: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
eb80: 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==3.**     sqli
eb90: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
eba0: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20  tOrFunction()   
ebb0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
ebc0: 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a  ode==4 or 5.**.*
ebd0: 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20  * In all cases, 
ebe0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65  the callbacks se
ebf0: 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30  t Walker.eCode=0
ec00: 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68   and abort if th
ec10: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
ec20: 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20  is found to not 
ec30: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  be a constant..*
ec40: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
ec50: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
ec60: 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73  Function() is us
ec70: 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  ed for evaluatin
ec80: 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  g expressions.**
ec90: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
eca0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
ecb0: 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  he Walker.eCode 
ecc0: 76 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20  value is 5 when 
ecd0: 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78  parsing.** an ex
ece0: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e  isting schema an
ecf0: 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73  d 4 when process
ed00: 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d  ing a new statem
ed10: 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a  ent.  A bound.**
ed20: 20 70 61 72 61 6d 65 74 65 72 20 72 61 69 73 65   parameter raise
ed30: 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e  s an error for n
ed40: 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62  ew statements, b
ed50: 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63  ut is silently c
ed60: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e  onverted.** to N
ed70: 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ULL for existing
ed80: 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20   schemas.  This 
ed90: 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61  allows sqlite_ma
eda0: 73 74 65 72 20 74 61 62 6c 65 73 20 74 68 61 74  ster tables that
edb0: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62   .** contain a b
edc0: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62  ound parameter b
edd0: 65 63 61 75 73 65 20 74 68 65 79 20 77 65 72 65  ecause they were
ede0: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c   generated by ol
edf0: 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  der versions.** 
ee00: 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20  of SQLite to be 
ee10: 70 61 72 73 65 64 20 62 79 20 6e 65 77 65 72 20  parsed by newer 
ee20: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
ee30: 74 65 20 77 69 74 68 6f 75 74 20 72 61 69 73 69  te without raisi
ee40: 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65  ng a.** malforme
ee50: 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a  d schema error..
ee60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
ee70: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
ee80: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
ee90: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
eea0: 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72  .  /* If pWalker
eeb0: 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68 65  ->eCode is 2 the
eec0: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
eed0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
eee0: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
eef0: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
ef00: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c  G clauses of a l
ef10: 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  eft join disqual
ef20: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
ef30: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
ef40: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
ef50: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
ef60: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
ef70: 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73 50  e==2 && ExprHasP
ef80: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
ef90: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
efa0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
efb0: 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  e = 0;.    retur
efc0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
efd0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
efe0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
eff0: 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f  Consider functio
f000: 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e  ns to be constan
f010: 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61  t if all their a
f020: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e  rguments are con
f030: 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64  stant.    ** and
f040: 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d   either pWalker-
f050: 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f  >eCode==4 or 5 o
f060: 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68  r the function h
f070: 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  as the.    ** SQ
f080: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20  LITE_FUNC_CONST 
f090: 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73  flag. */.    cas
f0a0: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
f0b0: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
f0c0: 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78  ->eCode>=4 || Ex
f0d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
f0e0: 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63  xpr,EP_ConstFunc
f0f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
f100: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
f110: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f120: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
f130: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
f140: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
f150: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
f160: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
f170: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 74     /* Convert "t
f180: 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22 20  rue" or "false" 
f190: 69 6e 20 61 20 44 45 46 41 55 4c 54 20 63 6c 61  in a DEFAULT cla
f1a0: 75 73 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  use into the.   
f1b0: 20 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74     ** appropriat
f1c0: 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 6f  e TK_TRUEFALSE o
f1d0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
f1e0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f1f0: 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45  IdToTrueFalse(pE
f200: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
f210: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
f220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f230: 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
f240: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
f250: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
f260: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
f270: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
f280: 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  LUMN:.      test
f290: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f2a0: 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20  =TK_ID );.      
f2b0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
f2c0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
f2d0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f2e0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f2f0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
f300: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f310: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
f320: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
f330: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
f340: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f350: 46 69 78 65 64 43 6f 6c 29 20 26 26 20 70 57 61  FixedCol) && pWa
f360: 6c 6b 65 72 2d 3e 65 43 6f 64 65 21 3d 32 20 29  lker->eCode!=2 )
f370: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
f380: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
f390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f3a0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f3b0: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
f3c0: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
f3d0: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
f3e0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
f3f0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
f400: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
f410: 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
f420: 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a 20  K_IF_NULL_ROW:. 
f430: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
f440: 54 45 52 3a 0a 20 20 20 20 20 20 74 65 73 74 63  TER:.      testc
f450: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
f460: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
f470: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f480: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f  Expr->op==TK_IF_
f490: 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20 20  NULL_ROW );.    
f4a0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
f4b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
f4c0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
f4d0: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
f4e0: 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  LE:.      if( pW
f4f0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20  alker->eCode==5 
f500: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ){.        /* Si
f510: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62  lently convert b
f520: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20  ound parameters 
f530: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73 69  that appear insi
f540: 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20  de of CREATE.   
f550: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
f560: 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77  ts into a NULL w
f570: 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20  hen parsing the 
f580: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
f590: 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20   text out.      
f5a0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69    ** of the sqli
f5b0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
f5c0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
f5d0: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
f5e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f5f0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
f600: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
f610: 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  A bound paramete
f620: 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73 74  r in a CREATE st
f630: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69  atement that ori
f640: 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20  ginates from.   
f650: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
f660: 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65 73  prepare() causes
f670: 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
f680: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f690: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
f6a0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
f6b0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
f6c0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
f6d0: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
f6e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f6f0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
f700: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71 6c 69  ELECT ); /* sqli
f710: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
f720: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
f730: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f740: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
f750: 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69  XISTS ); /* sqli
f760: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
f770: 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f  l() disallows */
f780: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
f790: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
f7a0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
f7b0: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
f7c0: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
f7d0: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
f7e0: 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65  ker w;.  w.eCode
f7f0: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
f800: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
f810: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
f820: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
f830: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
f840: 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
f850: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f860: 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63  DEBUG.  w.xSelec
f870: 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c  tCallback2 = sql
f880: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73  ite3SelectWalkAs
f890: 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20  sert2;.#endif.  
f8a0: 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  w.u.iCur = iCur;
f8b0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
f8c0: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
f8d0: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
f8e0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
f8f0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
f900: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
f910: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
f920: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
f930: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
f940: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
f950: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
f960: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
f970: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
f980: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
f990: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
f9a0: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
f9b0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
f9c0: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
f9d0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
f9e0: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
f9f0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
fa00: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
fa10: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
fa20: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
fa30: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
fa40: 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  p, 1, 0);.}../*.
fa50: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
fa60: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
fa70: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a  urn non-zero if.
fa80: 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 74 68 65 20  **.**   (1) the 
fa90: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
faa0: 6e 73 74 61 6e 74 2c 20 61 6e 64 0a 2a 2a 20 20  nstant, and.**  
fab0: 20 28 32 29 20 74 68 65 20 65 78 70 72 65 73 73   (2) the express
fac0: 69 6f 6e 20 64 6f 65 73 20 6f 72 69 67 69 6e 61  ion does origina
fad0: 74 65 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  te in the ON or 
fae0: 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
faf0: 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
fb00: 4a 4f 49 4e 2c 20 61 6e 64 0a 2a 2a 20 20 20 28  JOIN, and.**   (
fb10: 33 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  3) the expressio
fb20: 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  n does not conta
fb30: 69 6e 20 61 6e 79 20 45 50 5f 46 69 78 65 64 43  in any EP_FixedC
fb40: 6f 6c 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20  ol TK_COLUMN.** 
fb50: 20 20 20 20 20 20 6f 70 65 72 61 6e 64 73 20 63        operands c
fb60: 72 65 61 74 65 64 20 62 79 20 74 68 65 20 63 6f  reated by the co
fb70: 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
fb80: 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  on optimization.
fb90: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
fba0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
fbb0: 20 74 72 75 65 2c 20 69 74 20 69 6e 64 69 63 61   true, it indica
fbc0: 74 65 73 20 74 68 61 74 20 74 68 65 20 65 78 70  tes that the exp
fbd0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ression.** can b
fbe0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  e added to the p
fbf0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
fc00: 72 20 6c 69 73 74 20 61 6e 64 20 65 76 61 6c 75  r list and evalu
fc10: 61 74 65 64 20 6f 6e 63 65 20 77 68 65 6e 0a 2a  ated once when.*
fc20: 2a 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  * the prepared s
fc30: 74 61 74 65 6d 65 6e 74 20 73 74 61 72 74 73 20  tatement starts 
fc40: 75 70 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  up.  See sqlite3
fc50: 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 29  ExprCodeAtInit()
fc60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fc70: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
fc80: 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
fc90: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
fca0: 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d  onst(p, 2, 0);.}
fcb0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
fcc0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
fcd0: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
fce0: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
fcf0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
fd00: 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c  ** for any singl
fd10: 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62  e row of the tab
fd20: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
fd30: 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Cur.  In other w
fd40: 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70  ords, the.** exp
fd50: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  ression must not
fd60: 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f   refer to any no
fd70: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
fd80: 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79  function nor any
fd90: 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20  .** table other 
fda0: 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e  than iCur..*/.in
fdb0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  t sqlite3ExprIsT
fdc0: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70  ableConstant(Exp
fdd0: 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b  r *p, int iCur){
fde0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
fdf0: 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72  Const(p, 3, iCur
fe00: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  );.}.../*.** sql
fe10: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63  ite3WalkExpr() c
fe20: 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
fe30: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
fe40: 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 29  stantOrGroupBy()
fe50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fe60: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
fe70: 6e 74 4f 72 47 72 6f 75 70 42 79 28 57 61 6c 6b  ntOrGroupBy(Walk
fe80: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
fe90: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70  r *pExpr){.  Exp
fea0: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20  rList *pGroupBy 
feb0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47 72  = pWalker->u.pGr
fec0: 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b 0a  oupBy;.  int i;.
fed0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70  .  /* Check if p
fee0: 45 78 70 72 20 69 73 20 69 64 65 6e 74 69 63 61  Expr is identica
fef0: 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55 50 20 42  l to any GROUP B
ff00: 59 20 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20 63  Y term. If so, c
ff10: 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20 69 74 20  onsider.  ** it 
ff20: 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20 20  constant.  */.  
ff30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
ff40: 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
ff50: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
ff60: 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
ff70: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71  Expr;.    if( sq
ff80: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
ff90: 28 30 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d 31  (0, pExpr, p, -1
ffa0: 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  )<2 ){.      Col
ffb0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
ffc0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
ffd0: 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72  eq(pWalker->pPar
ffe0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66  se, p);.      if
fff0: 28 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72  ( sqlite3IsBinar
10000 79 28 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  y(pColl) ){.    
10010 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
10020 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
10030 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
10040 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73 20  eck if pExpr is 
10050 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66  a sub-select. If
10060 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74   so, consider it
10070 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20   variable. */.  
10080 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
10090 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
100a0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
100b0 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
100c0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
100d0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
100e0 20 72 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65   return exprNode
100f0 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b  IsConstant(pWalk
10100 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  er, pExpr);.}../
10110 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78  *.** Walk the ex
10120 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61  pression tree pa
10130 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
10140 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
10150 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69  rn non-zero.** i
10160 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10170 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
10180 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20  ly of constants 
10190 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72  or copies of ter
101a0 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70  ms .** in pGroup
101b0 42 79 20 74 68 61 74 20 73 6f 72 74 20 77 69 74  By that sort wit
101c0 68 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c  h the BINARY col
101d0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
101e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
101f0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
10200 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65  etermine if a te
10210 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47  rm of the HAVING
10220 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62   clause can.** b
10230 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20  e promoted into 
10240 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10250 2e 20 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  .  In order for 
10260 73 75 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e  such a promotion
10270 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65   to work,.** the
10280 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41   value of the HA
10290 56 49 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d  VING clause term
102a0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
102b0 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72  e for all member
102c0 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70  s of.** a "group
102d0 22 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d  ".  The requirem
102e0 65 6e 74 20 74 68 61 74 20 74 68 65 20 47 52 4f  ent that the GRO
102f0 55 50 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20  UP BY term must 
10300 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73  be BINARY.** ass
10310 75 6d 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  umes that no oth
10320 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  er collating seq
10330 75 65 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20  uence will have 
10340 61 20 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a  a finer-grained.
10350 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e  ** grouping than
10360 20 62 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68   binary.  In oth
10370 65 72 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f  er words (A=B CO
10380 4c 4c 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d  LLATE binary) im
10390 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20  plies.** A=B in 
103a0 65 76 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c  every other coll
103b0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ating sequence. 
103c0 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   The requirement
103d0 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f   that the.** GRO
103e0 55 50 20 42 59 20 62 65 20 42 49 4e 41 52 59 20  UP BY be BINARY 
103f0 69 73 20 73 74 72 69 63 74 65 72 20 74 68 61 6e  is stricter than
10400 20 6e 65 63 65 73 73 61 72 79 2e 20 20 49 74 20   necessary.  It 
10410 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a  would also work.
10420 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41  ** to promote HA
10430 56 49 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61  VING clauses tha
10440 74 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 61  t use the same a
10450 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
10460 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
10470 20 61 73 20 74 68 65 20 47 52 4f 55 50 20 42 59   as the GROUP BY
10480 20 74 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20   term, but that 
10490 69 73 20 6d 75 63 68 20 68 61 72 64 65 72 20 74  is much harder t
104a0 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65  o check,.** alte
104b0 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
104c0 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20  g sequences are 
104d0 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68  uncommon, and th
104e0 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a  is is only an.**
104f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73   optimization, s
10500 6f 20 77 65 20 74 61 6b 65 20 74 68 65 20 65 61  o we take the ea
10510 73 79 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73  sy way out and s
10520 69 6d 70 6c 79 20 72 65 71 75 69 72 65 20 74 68  imply require th
10530 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f  e.** GROUP BY to
10540 20 75 73 65 20 74 68 65 20 42 49 4e 41 52 59 20   use the BINARY 
10550 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10560 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
10570 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
10580 4f 72 47 72 6f 75 70 42 79 28 50 61 72 73 65 20  OrGroupBy(Parse 
10590 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
105a0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f  , ExprList *pGro
105b0 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20  upBy){.  Walker 
105c0 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31  w;.  w.eCode = 1
105d0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
105e0 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73  ack = exprNodeIs
105f0 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
10600 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  y;.  w.xSelectCa
10610 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e  llback = 0;.  w.
10620 75 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  u.pGroupBy = pGr
10630 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73  oupBy;.  w.pPars
10640 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
10650 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
10660 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
10670 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
10680 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
10690 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
106a0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
106b0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
106c0 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
106d0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
106e0 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
106f0 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
10700 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
10710 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
10720 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
10730 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
10740 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
10750 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
10760 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
10770 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
10780 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
10790 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
107a0 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
107b0 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
107c0 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
107d0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
107e0 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
107f0 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29  r *p, u8 isInit)
10800 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e  {.  assert( isIn
10810 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d  it==0 || isInit=
10820 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
10830 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b  xprIsConst(p, 4+
10840 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23  isInit, 0);.}..#
10850 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10860 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
10870 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
10880 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
10890 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
108a0 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
108b0 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65  ains a.** subque
108c0 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  ry of some kind.
108d0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
108e0 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75  ere are no subqu
108f0 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eries..*/.int sq
10900 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e  lite3ExprContain
10910 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a  sSubquery(Expr *
10920 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
10930 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20    w.eCode = 1;. 
10940 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
10950 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
10960 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c  lkNoop;.  w.xSel
10970 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
10980 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
10990 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ail;.#ifdef SQLI
109a0 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65  TE_DEBUG.  w.xSe
109b0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
109c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
109d0 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66  kAssert2;.#endif
109e0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
109f0 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
10a00 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a  urn w.eCode==0;.
10a10 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10a20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
10a30 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
10a40 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
10a50 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
10a60 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
10a70 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
10a80 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
10a90 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
10aa0 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
10ab0 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
10ac0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10ad0 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
10ae0 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
10af0 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
10b00 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
10b10 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
10b20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
10b30 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
10b40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
10b50 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
10b60 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
10b70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
10b80 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
10b90 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f  urn 0;  /* Can o
10ba0 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f  nly happen follo
10bb0 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a  wing on OOM */..
10bc0 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
10bd0 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
10be0 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
10bf0 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
10c00 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
10c10 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
10c20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
10c30 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
10c40 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
10c50 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
10c60 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
10c70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
10c80 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
10c90 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
10ca0 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
10cb0 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
10cc0 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
10cd0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
10ce0 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
10cf0 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
10d00 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
10d10 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
10d20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
10d30 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
10d40 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
10d50 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
10d60 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
10d70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10d80 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
10d90 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
10da0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
10db0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
10dc0 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
10dd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76         assert( v
10de0 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31  !=(-2147483647-1
10df0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) );.        *pV
10e00 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
10e10 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
10e20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10e30 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
10e40 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  t: break;.  }.  
10e50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10e60 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
10e70 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
10e80 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
10e90 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
10ea0 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e NULL..**.** If
10eb0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10ec0 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72  might be NULL or
10ed0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
10ee0 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65  on is too comple
10ef0 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74  x.** to tell ret
10f00 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a  urn TRUE.  .**.*
10f10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10f20 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74  s used as an opt
10f30 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b  imization, to sk
10f40 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63  ip OP_IsNull opc
10f50 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20  odes.** when we 
10f60 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75  know that a valu
10f70 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  e cannot be NULL
10f80 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73  .  Hence, a fals
10f90 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72  e positive.** (r
10fa0 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68  eturning TRUE wh
10fb0 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65  en in fact the e
10fc0 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65  xpression can ne
10fd0 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67  ver be NULL) mig
10fe0 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c  ht.** be a small
10ff0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
11000 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
11010 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20  e harmless.  On 
11020 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e  the other.** han
11030 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74  d, a false negat
11040 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46  ive (returning F
11050 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65  ALSE when the re
11060 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55  sult could be NU
11070 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65  LL).** will like
11080 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
11090 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
110a0 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f  .  So when in do
110b0 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54  ubt, return.** T
110c0 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  RUE..*/.int sqli
110d0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
110e0 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b  (const Expr *p){
110f0 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c  .  u8 op;.  whil
11100 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
11110 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
11120 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
11130 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
11140 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
11150 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
11160 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
11170 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
11180 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
11190 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
111a0 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
111b0 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
111c0 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
111d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
111e0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
111f0 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72       return Expr
11200 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
11210 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a  P_CanBeNull) ||.
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
11230 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20 52  pTab==0 ||  /* R
11240 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c 75  eference to colu
11250 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20 65  mn of index on e
11260 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
11270 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43            (p->iC
11280 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70  olumn>=0 && p->p
11290 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f  Tab->aCol[p->iCo
112a0 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
112b0 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  );.    default:.
112c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
112d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
112e0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
112f0 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
11300 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77   is a constant w
11310 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a  hich would be.**
11320 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50   unchanged by OP
11330 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74  _Affinity with t
11340 68 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65  he affinity give
11350 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  n in the second.
11360 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
11370 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11380 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
11390 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41  mine if the OP_A
113a0 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f  ffinity operatio
113b0 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74  n.** can be omit
113c0 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f  ted.  When in do
113d0 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ubt return FALSE
113e0 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74  .  A false negat
113f0 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65  ive.** is harmle
11400 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73  ss.  A false pos
11410 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20  itive, however, 
11420 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68  can result in th
11430 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65  e wrong.** answe
11440 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
11450 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
11460 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74  nityChange(const
11470 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61   Expr *p, char a
11480 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  ff){.  u8 op;.  
11490 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  if( aff==SQLITE_
114a0 41 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72  AFF_BLOB ) retur
114b0 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  n 1;.  while( p-
114c0 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
114d0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
114e0 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
114f0 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
11500 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
11510 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
11520 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
11530 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
11540 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
11550 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
11560 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
11570 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  GER || aff==SQLI
11580 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
11590 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
115a0 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
115b0 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
115c0 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20  ITE_AFF_REAL || 
115d0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
115e0 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20  NUMERIC;.    }. 
115f0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
11600 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  G: {.      retur
11610 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
11620 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  F_TEXT;.    }.  
11630 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
11640 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
11650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11660 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
11670 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
11680 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  Table>=0 );  /* 
11690 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74  p cannot be part
116a0 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73   of a CHECK cons
116b0 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
116c0 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d  return p->iColum
116d0 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  n<0.          &&
116e0 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
116f0 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
11700 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
11710 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ERIC);.    }.   
11720 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
11730 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
11740 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
11750 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
11760 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69  e given string i
11770 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d  s a row-id colum
11780 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73  n name..*/.int s
11790 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f  qlite3IsRowid(co
117a0 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
117b0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
117c0 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29  mp(z, "_ROWID_")
117d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
117e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
117f0 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29  ICmp(z, "ROWID")
11800 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
11810 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
11820 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d  ICmp(z, "OID")==
11830 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
11840 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
11850 2a 2a 20 70 58 20 69 73 20 74 68 65 20 52 48 53  ** pX is the RHS
11860 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   of an IN operat
11870 6f 72 2e 20 20 49 66 20 70 58 20 69 73 20 61 20  or.  If pX is a 
11880 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11890 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65   .** that can be
118a0 20 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61   simplified to a
118b0 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 61 63   direct table ac
118c0 63 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72  cess, then retur
118d0 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
118e0 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  o the SELECT sta
118f0 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69  tement.  If pX i
11900 73 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73  s not a SELECT s
11910 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20  tatement,.** or 
11920 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  if the SELECT st
11930 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f  atement needs to
11940 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69   be manifested i
11950 6e 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a  nto a transient.
11960 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72  ** table, then r
11970 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23  eturn NULL..*/.#
11980 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11990 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74  IT_SUBQUERY.stat
119a0 69 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e  ic Select *isCan
119b0 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45  didateForInOpt(E
119c0 78 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65  xpr *pX){.  Sele
119d0 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74  ct *p;.  SrcList
119e0 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69   *pSrc;.  ExprLi
119f0 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
11a00 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
11a10 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   i;.  if( !ExprH
11a20 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
11a30 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72  P_xIsSelect) ) r
11a40 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74  eturn 0;  /* Not
11a50 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20   a subquery */. 
11a60 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
11a70 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53  erty(pX, EP_VarS
11a80 65 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e  elect)  ) return
11a90 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74   0;  /* Correlat
11aa0 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d  ed subq */.  p =
11ab0 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a   pX->x.pSelect;.
11ac0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
11ad0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
11ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
11af0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
11b00 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65  T */.  if( p->se
11b10 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
11b20 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
11b30 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63  te) ){.    testc
11b40 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
11b50 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
11b60 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
11b70 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
11b80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
11b90 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
11ba0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
11bb0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
11bc0 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65  regate );.    re
11bd0 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49  turn 0; /* No DI
11be0 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61  STINCT keyword a
11bf0 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  nd no aggregate 
11c00 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d  functions */.  }
11c10 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
11c20 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20  roupBy==0 );    
11c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
11c40 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
11c50 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
11c60 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
11c70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11c80 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20  /* Has no LIMIT 
11c90 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
11ca0 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
11cb0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
11cc0 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45     /* Has no WHE
11cd0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70  RE clause */.  p
11ce0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
11cf0 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
11d00 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   );.  if( pSrc->
11d10 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
11d20 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
11d30 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46  Single term in F
11d40 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
11d50 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  if( pSrc->a[0].p
11d60 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
11d70 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69  0;     /* FROM i
11d80 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  s not a subquery
11d90 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54   or view */.  pT
11da0 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  ab = pSrc->a[0].
11db0 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  pTab;.  assert( 
11dc0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
11dd0 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65  ert( pTab->pSele
11de0 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  ct==0 );        
11df0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
11e00 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  se is not a view
11e10 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
11e20 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
11e30 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  rn 0;        /* 
11e40 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20  FROM clause not 
11e50 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
11e60 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
11e70 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  >pEList;.  asser
11e80 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
11e90 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20    /* All SELECT 
11ea0 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20  results must be 
11eb0 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f  columns. */.  fo
11ec0 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
11ed0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11ee0 20 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70    Expr *pRes = p
11ef0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
11f00 72 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d  r;.    if( pRes-
11f10 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
11f20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61   return 0;.    a
11f30 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61  ssert( pRes->iTa
11f40 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e  ble==pSrc->a[0].
11f50 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e  iCursor );  /* N
11f60 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  ot a correlated 
11f70 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a  subquery */.  }.
11f80 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65    return p;.}.#e
11f90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11fa0 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
11fb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11fc0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
11fd0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
11fe0 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68  e that checks th
11ff0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
12000 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c  mn of index tabl
12010 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66  e iCur to see if
12020 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  .** it contains 
12030 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73  any NULL entries
12040 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67  .  Cause the reg
12050 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e  ister at regHasN
12060 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a  ull to be set.**
12070 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   to a non-NULL v
12080 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e  alue if iCur con
12090 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20  tains no NULLs. 
120a0 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20   Cause register 
120b0 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f  regHasNull.** to
120c0 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
120d0 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
120e0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
120f0 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  L values..*/.sta
12100 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
12110 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56  SetHasNullFlag(V
12120 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72  dbe *v, int iCur
12130 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c  , int regHasNull
12140 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  ){.  int addr1;.
12150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12160 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12170 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
12180 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
12190 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
121a0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
121b0 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
121c0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
121d0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
121e0 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20  olumn, iCur, 0, 
121f0 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73  regHasNull);.  s
12200 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12210 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50  P5(v, OPFLAG_TYP
12220 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43  EOFARG);.  VdbeC
12230 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73  omment((v, "firs
12240 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c  t_entry_in(%d)",
12250 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74   iCur));.  sqlit
12260 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12270 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64  , addr1);.}.#end
12280 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
12290 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
122a0 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  Y./*.** The argu
122b0 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70  ment is an IN op
122c0 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69  erator with a li
122d0 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65  st (not a subque
122e0 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72  ry) on the .** r
122f0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20  ight-hand side. 
12300 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
12310 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e  that list is con
12320 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  stant..*/.static
12330 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68   int sqlite3InRh
12340 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  sIsConstant(Expr
12350 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a   *pIn){.  Expr *
12360 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b  pLHS;.  int res;
12370 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
12380 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c  HasProperty(pIn,
12390 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
123a0 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e  ;.  pLHS = pIn->
123b0 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c  pLeft;.  pIn->pL
123c0 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d  eft = 0;.  res =
123d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
123e0 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70  nstant(pIn);.  p
123f0 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53  In->pLeft = pLHS
12400 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
12410 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
12420 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12430 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70   used by the imp
12440 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
12450 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72  he IN (...) oper
12460 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20  ator..** The pX 
12470 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
12480 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74   expression on t
12490 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
124a0 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68   operator, which
124b0 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74  .** might be eit
124c0 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78  her a list of ex
124d0 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73  pressions or a s
124e0 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
124f0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
12500 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e  outine is to fin
12510 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d  d or create a b-
12520 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
12530 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
12540 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66  either to test f
12550 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e  or membership in
12560 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20   the RHS set or 
12570 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
12580 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72  gh.** all member
12590 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74  s of the RHS set
125a0 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
125b0 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63  cates..**.** A c
125c0 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20  ursor is opened 
125d0 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  on the b-tree ob
125e0 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65  ject that is the
125f0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
12600 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70  perator.** and p
12610 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74  X->iTable is set
12620 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
12630 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a   that cursor..**
12640 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
12650 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
12660 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65  unction indicate
12670 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70  s the b-tree typ
12680 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  e, as follows:.*
12690 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  *.**   IN_INDEX_
126a0 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65  ROWID      - The
126b0 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
126c0 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
126d0 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
126e0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
126f0 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
12700 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61  s opened on an a
12710 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a  scending index..
12720 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
12730 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63  DEX_DESC - The c
12740 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
12750 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
12760 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
12770 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20  INDEX_EPH       
12780 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
12790 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70  s opened on a sp
127a0 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20  ecially created 
127b0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
127d0 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
127e0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49  al table..**   I
127f0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20  N_INDEX_NOOP    
12800 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77     - No cursor w
12810 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54  as allocated.  T
12820 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d  he IN operator m
12830 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  ust be.**       
12840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12850 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73    implemented as
12860 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63   a sequence of c
12870 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a  omparisons..**.*
12880 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d  * An existing b-
12890 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75 73  tree might be us
128a0 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65 78  ed if the RHS ex
128b0 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61  pression pX is a
128c0 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75   simple.** subqu
128d0 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a  ery such as:.**.
128e0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63  **     SELECT <c
128f0 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e  olumn1>, <column
12900 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c  2>... FROM <tabl
12910 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e>.**.** If the 
12920 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
12930 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
12940 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c   or a more compl
12950 65 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65  ex subquery, the
12960 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61  n.** an ephemera
12970 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65  l table might ne
12980 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  ed to be generat
12990 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20  ed from the RHS 
129a0 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e  and then.** pX->
129b0 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70  iTable made to p
129c0 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65  oint to the ephe
129d0 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74  meral table inst
129e0 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69  ead of an.** exi
129f0 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a  sting table..**.
12a00 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70  ** The inFlags p
12a10 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f  arameter must co
12a20 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69  ntain, at a mini
12a30 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20  mum, one of the 
12a40 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  bits.** IN_INDEX
12a50 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49  _MEMBERSHIP or I
12a60 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74  N_INDEX_LOOP but
12a70 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49 66 20 69   not both.  If i
12a80 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a  nFlags contains.
12a90 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  ** IN_INDEX_MEMB
12aa0 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65  ERSHIP, then the
12ab0 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
12ac0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
12ad0 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62  r a fast.** memb
12ae0 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68  ership test.  Wh
12af0 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  en the IN_INDEX_
12b00 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c  LOOP bit is set,
12b10 20 74 68 65 20 49 4e 20 69 6e 64 65 78 20 77 69   the IN index wi
12b20 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  ll.** be used to
12b30 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76   loop over all v
12b40 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53  alues of the RHS
12b50 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12b60 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  tor..**.** When 
12b70 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73  IN_INDEX_LOOP is
12b80 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62   used (and the b
12b90 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
12ba0 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a  ed to iterate.**
12bb0 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74   through the set
12bc0 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74   members) then t
12bd0 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e  he b-tree must n
12be0 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69  ot contain dupli
12bf0 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68  cates..** An eph
12c00 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c  eremal table wil
12c10 6c 20 62 65 20 63 72 65 61 74 65 64 20 75 6e 6c  l be created unl
12c20 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
12c30 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61   columns are gua
12c40 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
12c50 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
12c60 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
12c70 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
12c80 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a  Y KEY or due to.
12c90 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73  ** a UNIQUE cons
12ca0 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e  traint or index.
12cb0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
12cc0 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
12cd0 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
12ce0 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
12cf0 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
12d00 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
12d10 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20   tests) then an 
12d20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
12d30 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
12d40 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73   unless <columns
12d50 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e  > is a single IN
12d60 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
12d70 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a  Y column or an .
12d80 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  ** index can be 
12d90 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73  found with the s
12da0 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e  pecified <column
12db0 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  s> as its left-m
12dc0 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ost..**.** If th
12dd0 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  e IN_INDEX_NOOP_
12de0 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  OK and IN_INDEX_
12df0 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62  MEMBERSHIP are b
12e00 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69  oth set and.** i
12e10 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
12e20 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
12e30 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
12e40 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69  bquery) then thi
12e50 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67  s.** routine mig
12e60 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63  ht decide that c
12e70 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
12e80 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20  eral b-tree for 
12e90 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65  membership.** te
12ea0 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70  sting is too exp
12eb0 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72  ensive and retur
12ec0 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
12ed0 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
12ee0 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  the.** calling r
12ef0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d  outine should im
12f00 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f  plement the IN o
12f10 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20  perator using a 
12f20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45  sequence.** of E
12f30 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73  q or Ne comparis
12f40 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  on operations..*
12f50 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
12f60 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
12f70 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
12f80 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
12f90 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
12fa0 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b   might need to k
12fb0 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
12fc0 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20  ot the RHS side 
12fd0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
12fe0 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  or.** contains a
12ff0 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73   NULL.  If prRhs
13000 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61  HasNull is not a
13010 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e   NULL pointer an
13020 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  d .** if there i
13030 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
13040 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
13050 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
13060 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
13070 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
13080 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
13090 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
130a0 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
130b0 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48  en.** to *prRhsH
130c0 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65  asNull. If there
130d0 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
130e0 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
130f0 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
13100 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52  value, then *prR
13110 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66  hsHasNull is lef
13120 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
13130 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
13140 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
13150 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73  d its location s
13160 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48  tored in *prRhsH
13170 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20  asNull, then.** 
13180 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61  the value in tha
13190 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20  t register will 
131a0 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62  be NULL if the b
131b0 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f  -tree contains o
131c0 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55  ne or more.** NU
131d0 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69  LL values, and i
131e0 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e  t will be some n
131f0 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
13200 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
13210 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20  ains no.** NULL 
13220 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  values..**.** If
13230 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d   the aiMap param
13240 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  eter is not NULL
13250 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  , it must point 
13260 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74  to an array cont
13270 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c  aining.** one el
13280 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63  ement for each c
13290 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
132a0 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
132b0 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48  tement on the RH
132c0 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e  S.** of the IN(.
132d0 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68  ..) operator. Th
132e0 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20  e i'th entry of 
132f0 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70  the array is pop
13300 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ulated with the.
13310 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  ** offset of the
13320 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
13330 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
13340 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  'th column retur
13350 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45  ned by the.** SE
13360 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c  LECT. For exampl
13370 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73  e, if the expres
13380 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65  sion and selecte
13390 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a  d index are:.**.
133a0 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20  **   (?,?,?) IN 
133b0 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20  (SELECT a, b, c 
133c0 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52  FROM t1).**   CR
133d0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
133e0 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a   t1(b, c, a);.**
133f0 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d  .** then aiMap[]
13400 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
13410 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f  th {2, 0, 1}..*/
13420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13430 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
13440 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  t sqlite3FindInI
13450 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
13460 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
13470 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
13480 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
13490 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pX,            
134a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
134b0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
134c0 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  S) of the IN ope
134d0 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69  rator */.  u32 i
134e0 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  nFlags,         
134f0 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45        /* IN_INDE
13500 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53  X_LOOP, _MEMBERS
13510 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f  HIP, and/or _NOO
13520 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  P_OK */.  int *p
13530 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20  rRhsHasNull,    
13540 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
13550 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74   holding NULL st
13560 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73  atus.  See notes
13570 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
135a0 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f   Index fields to
135b0 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29   RHS fields */.)
135c0 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
135f0 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
13600 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
13610 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
13620 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
13640 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
13650 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
13660 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
13670 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
13680 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
13690 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
136a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
136b0 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  eUnique;        
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
136d0 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
136e0 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
136f0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
13700 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13710 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
13720 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
13730 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
13740 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
13750 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71   );.  mustBeUniq
13760 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20  ue = (inFlags & 
13770 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d  IN_INDEX_LOOP)!=
13780 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
13790 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e  RHS of this IN(.
137a0 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ..) operator is 
137b0 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66  a SELECT, and if
137c0 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a   it matters .  *
137d0 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
137e0 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75   the SELECT resu
137f0 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  lt contains NULL
13800 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77   values, check w
13810 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
13820 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61  ot NULL is actua
13830 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74  lly possible (it
13840 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72   may not be, for
13850 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20   example, due . 
13860 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20   ** to NOT NULL 
13870 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
13880 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e  he schema). If n
13890 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
138a0 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a  e possible,.  **
138b0 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c   set prRhsHasNul
138c0 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f  l to 0 before co
138d0 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20  ntinuing.  */.  
138e0 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
138f0 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26   && (pX->flags &
13900 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
13910 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
13920 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
13930 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  t = pX->x.pSelec
13940 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66  t->pEList;.    f
13950 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
13960 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
13970 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
13980 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45  ExprCanBeNull(pE
13990 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
139a0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
139b0 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69  .    if( i==pELi
139c0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
139d0 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20     prRhsHasNull 
139e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
139f0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
13a00 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
13a10 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
13a20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
13a30 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
13a40 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
13a50 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
13a60 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
13a70 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
13a80 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  able.  */.  if( 
13a90 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
13aa0 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64  && (p = isCandid
13ab0 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29  ateForInOpt(pX))
13ac0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
13ad0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
13ae0 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
13af0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
13b00 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
13b10 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b30 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
13b40 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
13b50 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20  i16 iDb;        
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
13b80 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20  se idx for pTab 
13b90 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
13ba0 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  *pEList = p->pEL
13bb0 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78  ist;.    int nEx
13bc0 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
13bd0 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  pr;..    assert(
13be0 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c00 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
13c10 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
13c20 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
13c30 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
13c40 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20  .pExpr!=0 ); /* 
13c50 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
13c60 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
13c70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
13c80 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20   p->pSrc!=0 );  
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13ca0 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
13cb0 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
13cc0 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  ) */.    pTab = 
13cd0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
13ce0 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65  ab;..    /* Code
13cf0 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69   an OP_Transacti
13d00 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c  on and OP_TableL
13d10 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e  ock for <table>.
13d20 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
13d30 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
13d40 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
13d50 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
13d60 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
13d70 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
13d80 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
13d90 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
13da0 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
13db0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
13dc0 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 20  .    assert(v); 
13dd0 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64   /* sqlite3GetVd
13de0 62 65 28 29 20 68 61 73 20 61 6c 77 61 79 73 20  be() has always 
13df0 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
13e00 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66  called */.    if
13e10 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ( nExpr==1 && pE
13e20 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
13e30 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
13e40 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49       /* The "x I
13e50 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20  N (SELECT rowid 
13e60 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73  FROM table)" cas
13e70 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  e */.      int i
13e80 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
13e90 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
13ea0 6e 63 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  nce);.      Vdbe
13eb0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
13ec0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
13ed0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
13ee0 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
13ef0 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
13f00 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
13f10 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20  EX_ROWID;..     
13f20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13f30 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
13f40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13f50 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
13f80 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
13f90 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
13fa0 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  _ok = 1;.      i
13fb0 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nt i;..      /* 
13fc0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  Check that the a
13fd0 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c  ffinity that wil
13fe0 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72  l be used to per
13ff0 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20 20 20  form each .     
14000 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   ** comparison i
14010 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
14020 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 65 61  e affinity of ea
14030 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62  ch column in tab
14040 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
14050 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
14060 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 69   operator.  If i
14070 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  t not, it is not
14080 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20 20   possible to.   
14090 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e     ** use any in
140a0 64 65 78 20 6f 66 20 74 68 65 20 52 48 53 20 74  dex of the RHS t
140b0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  able.  */.      
140c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
140d0 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b   && affinity_ok;
140e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
140f0 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69  xpr *pLhs = sqli
14100 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
14110 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c  bexpr(pX->pLeft,
14120 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   i);.        int
14130 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   iCol = pEList->
14140 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[i].pExpr->iCol
14150 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  umn;.        cha
14160 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74  r idxaff = sqlit
14170 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66  e3TableColumnAff
14180 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f 6c 29  inity(pTab,iCol)
14190 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20 2a  ; /* RHS table *
141a0 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  /.        char c
141b0 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43  mpaff = sqlite3C
141c0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
141d0 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a 20 20  Lhs, idxaff);.  
141e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
141f0 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  cmpaff==SQLITE_A
14200 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20  FF_BLOB );.     
14210 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70     testcase( cmp
14220 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14230 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
14240 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20 29  switch( cmpaff )
14250 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
14260 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
14270 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  :.            br
14280 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
14290 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
142a0 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20  EXT:.           
142b0 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70 61   /* sqlite3Compa
142c0 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c  reAffinity() onl
142d0 79 20 72 65 74 75 72 6e 73 20 54 45 58 54 20 69  y returns TEXT i
142e0 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  f one side or th
142f0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
14300 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 61 66   other has no af
14310 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65 20 6f  finity and the o
14320 74 68 65 72 20 73 69 64 65 20 69 73 20 54 45 58  ther side is TEX
14330 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20 20 20  T.  Hence,.     
14340 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e         ** the on
14350 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70 61 66  ly way for cmpaf
14360 66 20 74 6f 20 62 65 20 54 45 58 54 20 69 73 20  f to be TEXT is 
14370 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20 62 65  for idxaff to be
14380 20 54 45 58 54 0a 20 20 20 20 20 20 20 20 20 20   TEXT.          
14390 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68 65    ** and for the
143a0 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53   term on the LHS
143b0 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20 68 61   of the IN to ha
143c0 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20  ve no affinity. 
143d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  */.            a
143e0 73 73 65 72 74 28 20 69 64 78 61 66 66 3d 3d 53  ssert( idxaff==S
143f0 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
14400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
14410 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64  eak;.          d
14420 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
14430 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20      affinity_ok 
14440 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  = sqlite3IsNumer
14450 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 61 66  icAffinity(idxaf
14460 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  f);.        }.  
14470 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
14480 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a   affinity_ok ){.
14490 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
144a0 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
144b0 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 69 6c  g index that wil
144c0 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69 73 20  l work for this 
144d0 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
144e0 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
144f0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
14500 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 3b 20  dx && eType==0; 
14510 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
14520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  ){.          Bit
14530 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20  mask colUsed;   
14540 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66     /* Columns of
14550 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
14560 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  */.          Bit
14570 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20  mask mCol;      
14580 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74     /* Mask for t
14590 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d  he current colum
145a0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  n */.          i
145b0 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
145c0 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69 6e 75  <nExpr ) continu
145d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;.          /* 
145e0 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20  Maximum nColumn 
145f0 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d  is BMS-2, not BM
14600 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77 65 20  S-1, so that we 
14610 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20 20  can compute.    
14620 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41 53 4b        ** BITMASK
14630 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75 74 20  (nExpr) without 
14640 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20  overflowing */. 
14650 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
14660 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  e( pIdx->nColumn
14670 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20  ==BMS-2 );.     
14680 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
14690 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d  Idx->nColumn==BM
146a0 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  S-1 );.         
146b0 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
146c0 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e 74  mn>=BMS-1 ) cont
146d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
146e0 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65  if( mustBeUnique
146f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14700 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  if( pIdx->nKeyCo
14710 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  l>nExpr.        
14720 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e 43       ||(pIdx->nC
14730 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20 21  olumn>nExpr && !
14740 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
14750 64 78 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  dx)).           
14760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14770 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
14780 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f  This index is no
14790 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20 74 68  t unique over th
147a0 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e 73  e IN RHS columns
147b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
147c0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
147d0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73  .          colUs
147e0 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6c  ed = 0;   /* Col
147f0 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20 75 73  umns of index us
14800 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  ed so far */.   
14810 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
14820 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  i<nExpr; i++){. 
14830 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
14840 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56  *pLhs = sqlite3V
14850 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
14860 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b  r(pX->pLeft, i);
14870 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
14880 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73 74  r *pRhs = pEList
14890 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
148a0 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
148b0 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65  q *pReq = sqlite
148c0 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
148d0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
148e0 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20  hs, pRhs);.     
148f0 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
14900 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
14910 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c 7c 20  ert( pReq!=0 || 
14920 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58  pRhs->iColumn==X
14930 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61 72 73  N_ROWID || pPars
14940 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20 20  e->nErr );.     
14950 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
14960 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  j<nExpr; j++){. 
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
14980 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
14990 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d  j]!=pRhs->iColum
149a0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
149b0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
149c0 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  rt( pIdx->azColl
149d0 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  [j] );.         
149e0 20 20 20 20 20 69 66 28 20 70 52 65 71 21 3d 30       if( pReq!=0
149f0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
14a00 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20  mp(pReq->zName, 
14a10 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  pIdx->azColl[j])
14a20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
14a30 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
14a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
14a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
14a60 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14a70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
14a80 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62  if( j==nExpr ) b
14a90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14aa0 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49 54    mCol = MASKBIT
14ab0 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (j);.           
14ac0 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c 55   if( mCol & colU
14ad0 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  sed ) break; /* 
14ae0 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65 64  Each column used
14af0 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20 20   only once */.  
14b00 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65            colUse
14b10 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20 20  d |= mCol;.     
14b20 20 20 20 20 20 20 20 69 66 28 20 61 69 4d 61 70         if( aiMap
14b30 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b   ) aiMap[i] = j;
14b40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  .          }.  .
14b50 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
14b60 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63 6f  ( i==nExpr || co
14b70 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49 54 28  lUsed!=(MASKBIT(
14b80 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20 20 20  nExpr)-1) );.   
14b90 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 55 73         if( colUs
14ba0 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78  ed==(MASKBIT(nEx
14bb0 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  pr)-1) ){.      
14bc0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
14bd0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
14be0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
14bf0 69 6e 64 65 78 20 70 49 64 78 20 69 73 20 75 73  index pIdx is us
14c00 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
14c10 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
14c20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14c30 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
14c40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14c50 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 6c              Expl
14c60 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
14c70 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  arse, 0,.       
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c90 20 20 20 20 20 20 20 22 55 53 49 4e 47 20 49 4e         "USING IN
14ca0 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50  DEX %s FOR IN-OP
14cb0 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e  ERATOR",pIdx->zN
14cc0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
14cd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14ce0 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
14cf0 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
14d00 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
14d10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14d20 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
14d30 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
14d40 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
14d50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
14d60 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
14d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
14d80 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
14d90 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
14da0 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
14db0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
14dc0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
14dd0 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
14de0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
14df0 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ;.  .           
14e00 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
14e10 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  l ){.#ifdef SQLI
14e20 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
14e30 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
14e40 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61 73           i64 mas
14e50 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31  k = (1<<nExpr)-1
14e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14e70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14e80 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
14e90 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20  mnsUsed, .      
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
14eb0 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61  , 0, 0, (u8*)&ma
14ec0 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  sk, P4_INT64);.#
14ed0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
14ee0 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
14ef0 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
14f00 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
14f10 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29    if( nExpr==1 )
14f20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
14f30 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
14f40 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c  ullFlag(v, iTab,
14f50 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b   *prRhsHasNull);
14f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
14f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
14f80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14f90 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
14fa0 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
14fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
14fc0 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* End loop over
14fd0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20   indexes */.    
14fe0 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61    } /* End if( a
14ff0 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a  ffinity_ok ) */.
15000 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20      } /* End if 
15010 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64  not an rowid ind
15020 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64  ex */.  } /* End
15030 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69   attempt to opti
15040 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e  mize using an in
15050 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  dex */..  /* If 
15060 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69  no preexisting i
15070 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c  ndex is availabl
15080 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61  e for the IN cla
15090 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f  use.  ** and IN_
150a0 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e  INDEX_NOOP is an
150b0 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20   allowed reply. 
150c0 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
150d0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
150e0 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f  or is a list, no
150f0 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a  t a subquery.  *
15100 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73  * and the RHS is
15110 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72   not constant or
15120 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65   has two or fewe
15130 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68  r terms,.  ** th
15140 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72  en it is not wor
15150 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65  th creating an e
15160 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
15170 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20  o evaluate.  ** 
15180 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
15190 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  so return IN_IND
151a0 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20  EX_NOOP..  */.  
151b0 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20  if( eType==0.   
151c0 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e  && (inFlags & IN
151d0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a  _INDEX_NOOP_OK).
151e0 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
151f0 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
15200 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28  sSelect).   && (
15210 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43  !sqlite3InRhsIsC
15220 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70  onstant(pX) || p
15230 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  X->x.pList->nExp
15240 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65  r<=2).  ){.    e
15250 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
15260 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
15270 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   eType==0 ){.   
15280 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69   /* Could not fi
15290 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  nd an existing t
152a0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
152b0 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20   use as the RHS 
152c0 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57  b-tree..    ** W
152d0 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67  e will have to g
152e0 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d  enerate an ephem
152f0 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f  eral table to do
15300 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f   the job..    */
15310 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e 51  .    u32 savedNQ
15320 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
15330 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
15340 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e     int rMayHaveN
15350 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79  ull = 0;.    eTy
15360 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50  pe = IN_INDEX_EP
15370 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61  H;.    if( inFla
15380 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
15390 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  OP ){.      pPar
153a0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
153b0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58   0;.      if( pX
153c0 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ->pLeft->iColumn
153d0 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72  <0 && !ExprHasPr
153e0 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
153f0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
15400 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
15410 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
15420 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
15430 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29  ( prRhsHasNull )
15440 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61  {.      *prRhsHa
15450 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65  sNull = rMayHave
15460 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
15470 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  >nMem;.    }.   
15480 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
15490 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
154a0 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  , rMayHaveNull, 
154b0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
154c0 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72  ROWID);.    pPar
154d0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
154e0 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
154f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
15500 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  X->iTable = iTab
15510 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d  ;.  }..  if( aiM
15520 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f  ap && eType!=IN_
15530 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
15540 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44  && eType!=IN_IND
15550 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b  EX_INDEX_DESC ){
15560 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
15570 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78     n = sqlite3Ex
15580 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d  prVectorSize(pX-
15590 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72  >pLeft);.    for
155a0 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20  (i=0; i<n; i++) 
155b0 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20  aiMap[i] = i;.  
155c0 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
155d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
155e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
155f0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41  SUBQUERY./*.** A
15600 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73  rgument pExpr is
15610 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e   an (?, ?...) IN
15620 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
15630 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
15640 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
15650 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d  d returns a nul-
15660 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
15670 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  g containing .**
15680 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20   the affinities 
15690 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
156a0 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
156b0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a  e comparison..**
156c0 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
156d0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
156e0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
156f0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
15700 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67  turned.** string
15710 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
15720 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
15730 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  e3DbFree()..*/.s
15740 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72  tatic char *expr
15750 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  INAffinity(Parse
15760 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
15770 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a  pExpr){.  Expr *
15780 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
15790 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  Left;.  int nVal
157a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
157b0 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
157c0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
157d0 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61  ct = (pExpr->fla
157e0 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
157f0 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53  t) ? pExpr->x.pS
15800 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61  elect : 0;.  cha
15810 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65  r *zRet;..  asse
15820 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
15830 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d  K_IN );.  zRet =
15840 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
15850 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Raw(pParse->db, 
15860 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a  nVal+1);.  if( z
15870 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
15880 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
15890 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
158a0 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71     Expr *pA = sq
158b0 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
158c0 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
158d0 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 20  );.      char a 
158e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
158f0 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20 20  inity(pA);.     
15900 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
15910 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
15920 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
15930 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63 74  Affinity(pSelect
15940 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
15950 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20 20  Expr, a);.      
15960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
15970 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20 20  Ret[i] = a;.    
15980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52    }.    }.    zR
15990 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b  et[nVal] = '\0';
159a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
159b0 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  et;.}.#endif..#i
159c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
159d0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
159e0 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65 20   Load the Parse 
159f0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
15a00 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
15a10 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ent with an erro
15a20 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 66  r .** message of
15a30 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
15a40 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72     "sub-select r
15a50 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73  eturns N columns
15a60 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a 2a   - expected M".*
15a70 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
15a80 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
15a90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15aa0 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74 20  nt nActual, int 
15ab0 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e 73  nExpect){.  cons
15ac0 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 22  t char *zFmt = "
15ad0 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
15ae0 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d 20  ns %d columns - 
15af0 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20 20  expected %d";.  
15b00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15b10 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e 41  pParse, zFmt, nA
15b20 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29 3b  ctual, nExpect);
15b30 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15b40 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
15b50 72 20 69 73 20 61 20 76 65 63 74 6f 72 20 74 68  r is a vector th
15b60 61 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  at has been used
15b70 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77 68   in a context wh
15b80 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  ere.** it is not
15b90 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20 70   permitted. If p
15ba0 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73 65  Expr is a sub-se
15bb0 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68 69  lect vector, thi
15bc0 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c 6f  s routine .** lo
15bd0 61 64 73 20 74 68 65 20 50 61 72 73 65 20 6f 62  ads the Parse ob
15be0 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65 73 73  ject with a mess
15bf0 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
15c00 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
15c10 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
15c20 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
15c30 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  d 1".**.** Or, i
15c40 66 20 69 74 20 69 73 20 61 20 72 65 67 75 6c 61  f it is a regula
15c50 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72 3a  r scalar vector:
15c60 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76 61  .**.**   "row va
15c70 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f 20  lue misused".*/ 
15c80 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56    .void sqlite3V
15c90 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50 61  ectorErrorMsg(Pa
15ca0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
15cb0 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e 64  r *pExpr){.#ifnd
15cc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
15cd0 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45  UBQUERY.  if( pE
15ce0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
15cf0 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  xIsSelect ){.   
15d00 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
15d10 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
15d20 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
15d30 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
15d40 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  1);.  }else.#end
15d50 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
15d60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15d70 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
15d80 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  sused");.  }.}..
15d90 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
15da0 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
15db0 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
15dc0 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70  s a subquery exp
15dd0 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c  ression, EXISTS,
15de0 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74  .** or IN operat
15df0 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
15e00 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
15e10 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
15e20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
15e30 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
15e40 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
15e50 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
15e60 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
15e70 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
15e80 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
15e90 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
15ea0 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
15eb0 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
15ec0 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
15ed0 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
15ee0 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
15ef0 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
15f00 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
15f10 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
15f20 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
15f30 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
15f40 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
15f50 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
15f60 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
15f70 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e  ter isRowid is n
15f80 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78  on-zero, then ex
15f90 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
15fa0 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
15fb0 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  to be of the for
15fc0 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f  m "<rowid> IN (?
15fd0 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20  , ?, ?)", where 
15fe0 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66  <rowid> is a ref
15ff0 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d  erence.** to som
16000 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f  e integer key co
16010 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20  lumn of a table 
16020 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
16030 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20  case, use an.** 
16040 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f  intkey B-Tree to
16050 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
16060 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73  f IN(...) values
16070 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
16080 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72  usual.** (slower
16090 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  ) variable lengt
160a0 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a  h keys B-Tree..*
160b0 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
160c0 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Null is non-zero
160d0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
160e0 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  t the operation 
160f0 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74  is an IN.** (not
16100 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
16110 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68  STS) and that th
16120 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74  e RHS might cont
16130 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41  ains NULLs..** A
16140 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
16150 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69  does is initiali
16160 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ze the register 
16170 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76  given by rMayHav
16180 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c  eNull.** to NULL
16190 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69  .  Calling routi
161a0 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61  nes will take ca
161b0 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74  re of changing t
161c0 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  his register.** 
161d0 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c  value to non-NUL
161e0 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  L if the RHS is 
161f0 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a  NULL-free..**.**
16200 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72   For a SELECT or
16210 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
16220 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67  , return the reg
16230 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
16240 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20   the.** result. 
16250 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c   For a multi-col
16260 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65 20  umn SELECT, the 
16270 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
16280 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73   in a contiguous
16290 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67  .** array of reg
162a0 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 72  isters and the r
162b0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
162c0 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  he register of t
162d0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
162e0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20  result column.  
162f0 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e 20  Return 0 for IN 
16300 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20  operators or if 
16310 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
16320 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
16330 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
16340 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
16350 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72  Subselect(.  Par
16360 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
16370 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
16380 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
16390 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
163a0 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20       /* The IN, 
163b0 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54  SELECT, or EXIST
163c0 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  S operator */.  
163d0 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  int rHasNullFlag
163e0 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ,       /* Regis
163f0 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73  ter that records
16400 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65   whether NULLs e
16410 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20  xist in RHS */. 
16420 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20   int isRowid    
16430 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
16440 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f  rue, LHS of IN o
16450 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77  perator is a row
16460 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  id */.){.  int j
16470 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
16480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16490 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
164a0 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
164b0 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
164c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
164e0 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67  Register storing
164f0 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20   resulting */.  
16500 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
16510 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
16520 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
16530 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
16540 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61  .  /* The evalua
16550 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45  tion of the IN/E
16560 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73  XISTS/SELECT mus
16570 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76  t be repeated ev
16580 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a  ery time it.  **
16590 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
165a0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
165b0 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
165c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
165d0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
165e0 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
165f0 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
16600 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
16610 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
16620 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
16630 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
16640 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
16650 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
16660 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
16670 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
16680 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
16690 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
166a0 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
166b0 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
166c0 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
166d0 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
166e0 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
166f0 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
16700 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
16710 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16720 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
16730 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49  ect) ){.    jmpI
16740 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74  fDynamic = sqlit
16750 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
16760 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
16770 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
16780 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
16790 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
167a0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
167b0 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
167c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
167d0 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
167e0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
167f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ction */.      E
16800 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
16810 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68  pr->pLeft; /* th
16820 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
16830 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
16840 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
16850 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  nfo = 0;      /*
16860 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   Key information
16870 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56   */.      int nV
16880 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
16890 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
168a0 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f   vector pLeft */
168b0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56  .      .      nV
168c0 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
168d0 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
168e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
168f0 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61   !isRowid || nVa
16900 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  l==1 );..      /
16910 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69  * Whether this i
16920 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43  s an 'x IN(SELEC
16930 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20  T...)' or an 'x 
16940 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a  IN(<exprlist>)'.
16950 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
16960 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65  ion it is handle
16970 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20  d the same way. 
16980 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   An ephemeral ta
16990 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  ble is .      **
169a0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e 64   filled with ind
169b0 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e  ex keys represen
169c0 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
169d0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
169e0 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74 68   ** SELECT or th
169f0 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
16a00 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
16a10 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
16a20 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
16a30 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
16a40 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
16a50 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
16a60 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
16a70 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
16a80 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
16a90 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
16aa0 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
16ab0 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
16ac0 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
16ad0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
16ae0 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
16af0 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
16b00 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
16b10 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
16b20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
16b30 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
16b40 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
16b50 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
16b60 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
16b70 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
16b80 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
16b90 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
16ba0 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
16bb0 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
16bc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
16bd0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
16be0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
16bf0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
16c00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16c10 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
16c20 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45  l, .          pE
16c30 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73  xpr->iTable, (is
16c40 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a  Rowid?0:nVal));.
16c50 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
16c60 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73   isRowid ? 0 : s
16c70 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
16c80 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
16c90 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  Val, 1);..      
16ca0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
16cb0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
16cc0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
16cd0 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
16ce0 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
16cf0 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
16d00 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
16d10 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
16d20 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
16d30 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
16d40 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
16d50 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
16d60 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
16d70 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
16d80 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16d90 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
16da0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  t = pExpr->x.pSe
16db0 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45 78  lect;.        Ex
16dc0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
16dd0 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
16de0 3b 0a 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61  ;..        Expla
16df0 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
16e00 72 73 65 2c 20 31 2c 20 22 25 73 4c 49 53 54 20  rse, 1, "%sLIST 
16e10 53 55 42 51 55 45 52 59 22 2c 0a 20 20 20 20 20  SUBQUERY",.     
16e20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
16e30 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45  mic>=0?"":"CORRE
16e40 4c 41 54 45 44 20 22 0a 20 20 20 20 20 20 20 20  LATED ".        
16e50 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
16e60 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
16e70 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
16e80 65 20 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66  e LHS and RHS of
16e90 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
16ea0 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74   do not match, t
16eb0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  hat.        ** e
16ec0 72 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62  rror will have b
16ed0 65 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20  een caught long 
16ee0 62 65 66 6f 72 65 20 77 65 20 72 65 61 63 68 20  before we reach 
16ef0 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20  this point. */. 
16f00 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59         if( ALWAY
16f10 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  S(pEList->nExpr=
16f20 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  =nVal) ){.      
16f30 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
16f40 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  est;.          i
16f50 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
16f60 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
16f70 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
16f80 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
16f90 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ble);.          
16fa0 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20  dest.zAffSdst = 
16fb0 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70  exprINAffinity(p
16fc0 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
16fd0 20 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74           pSelect
16fe0 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
16ff0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17000 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ( pSelect->selFl
17010 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
17020 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  t );.          t
17030 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66  estcase( pKeyInf
17040 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65  o==0 ); /* Cause
17050 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69  d by OOM in sqli
17060 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
17070 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  ) */.          i
17080 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
17090 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
170a0 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
170b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
170c0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
170d0 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29  , dest.zAffSdst)
170e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
170f0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
17100 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  f(pKeyInfo);.   
17110 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17120 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
17130 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17140 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
17150 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74  b, dest.zAffSdst
17160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
17170 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ert( pKeyInfo!=0
17180 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20   ); /* OOM will 
17190 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65 72  cause exit after
171a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
171b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
171c0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
171d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
171e0 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
171f0 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  pr>0 );.        
17200 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17210 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
17220 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
17230 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
17240 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29  =0; i<nVal; i++)
17250 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
17260 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56  pr *p = sqlite3V
17270 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
17280 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
17290 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
172a0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  o->aColl[i] = sq
172b0 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
172c0 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20  reCollSeq(.     
172d0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
172e0 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e, p, pEList->a[
172f0 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20  i].pExpr.       
17300 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
17310 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
17320 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
17330 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
17340 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
17350 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
17360 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
17370 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
17380 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
17390 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
173a0 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
173b0 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
173c0 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
173d0 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
173e0 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
173f0 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
17400 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
17410 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
17420 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
17430 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
17440 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
17450 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
17460 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
17470 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
17480 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
17490 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
174a0 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
174b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
174c0 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48  finity of the LH
174d0 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20  S of the IN */. 
174e0 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
174f0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
17500 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
17510 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
17520 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
17530 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
17540 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c       int r1, r2,
17550 20 72 33 3b 0a 20 20 20 20 20 20 20 20 61 66 66   r3;.        aff
17560 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
17570 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
17580 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
17590 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
175a0 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
175b0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
175c0 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  B;.        }.   
175d0 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
175e0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  o ){.          a
175f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
17600 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
17610 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
17620 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
17630 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  ->aColl[0] = sql
17640 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
17650 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17660 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Left);.        }
17670 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
17680 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
17690 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
176a0 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
176b0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
176c0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
176d0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
176e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
176f0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17700 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
17710 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
17720 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
17730 30 2c 20 72 32 2c 20 30 2c 20 22 22 2c 20 50 34  0, r2, 0, "", P4
17740 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
17750 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
17760 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
17770 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
17780 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
17790 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
177a0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
177b0 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
177c0 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
177d0 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
177e0 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
177f0 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
17800 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
17810 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
17820 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
17830 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
17840 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
17850 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
17860 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
17870 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
17880 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
17890 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
178a0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
178b0 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
178c0 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
178d0 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
178e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
178f0 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
17900 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
17910 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
17920 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
17930 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
17940 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49  geToNoop(v, jmpI
17950 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20  fDynamic);.     
17960 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
17970 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mic = -1;.      
17980 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
17990 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
179a0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
179b0 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
179c0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
179d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
179e0 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65  sRowid && sqlite
179f0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
17a00 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20  E2, &iValToIns) 
17a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
17a20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17a30 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  (v, OP_InsertInt
17a40 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17a50 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b   r2, iValToIns);
17a60 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
17a70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33  {.            r3
17a80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17a90 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
17aa0 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
17ab0 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
17ac0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
17ad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17ae0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
17af0 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20  BeInt, r3,.     
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17b20 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17b30 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
17b40 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
17b50 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17b70 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
17b80 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
17b90 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
17ba0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
17bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
17bc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17bd0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
17be0 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
17bf0 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
17c00 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17c10 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
17c20 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
17c30 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
17c40 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20  r2, r3, 1);.    
17c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17c60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
17c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
17c80 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17c90 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
17ca0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17cb0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17cc0 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
17cd0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
17ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17cf0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
17d00 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
17d10 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
17d20 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
17d30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17d40 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
17d50 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
17d60 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
17d70 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
17d80 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 20 20 28   /* Case 3:    (
17d90 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
17da0 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  ...).      **   
17db0 20 20 6f 72 3a 20 20 20 20 45 58 49 53 54 53 28    or:    EXISTS(
17dc0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
17dd0 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ...).      **.  
17de0 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c      ** For a SEL
17df0 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  ECT, generate co
17e00 64 65 20 74 6f 20 70 75 74 20 74 68 65 20 76 61  de to put the va
17e10 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  lues for all col
17e20 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a  umns of.      **
17e30 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 69   the first row i
17e40 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
17e50 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 72 65  registers and re
17e60 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
17e70 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66  f.      ** the f
17e80 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20  irst register.. 
17e90 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17ea0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
17eb0 58 49 53 54 53 2c 20 77 72 69 74 65 20 61 6e 20  XISTS, write an 
17ec0 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
17ed0 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
17ee0 73 74 73 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e  sts).      ** in
17ef0 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  to a register an
17f00 64 20 72 65 74 75 72 6e 20 74 68 61 74 20 72 65  d return that re
17f10 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20  gister number.. 
17f20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17f30 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20   In both cases, 
17f40 74 68 65 20 71 75 65 72 79 20 69 73 20 61 75 67  the query is aug
17f50 6d 65 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d  mented with "LIM
17f60 49 54 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 20  IT 1".  Any .   
17f70 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e     ** preexistin
17f80 67 20 6c 69 6d 69 74 20 69 73 20 64 69 73 63 61  g limit is disca
17f90 72 64 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  rded in place of
17fa0 20 74 68 65 20 6e 65 77 20 4c 49 4d 49 54 20 31   the new LIMIT 1
17fb0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17fc0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fe0 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
17ff0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
18000 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65  code */.      Se
18010 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18030 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65      /* How to de
18040 61 6c 20 77 69 74 68 20 53 45 4c 45 43 54 20 72  al with SELECT r
18050 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
18060 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18080 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
18090 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
180a0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
180b0 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
180d0 4e 65 77 20 6c 69 6d 69 74 20 65 78 70 72 65 73  New limit expres
180e0 73 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 74  sion */..      t
180f0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
18100 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
18110 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18120 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
18130 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61  ELECT );.      a
18140 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
18150 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70  ==TK_EXISTS || p
18160 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
18170 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ECT );.      ass
18180 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
18190 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
181a0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20  IsSelect) );..  
181b0 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72      pSel = pExpr
181c0 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
181d0 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
181e0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
181f0 22 25 73 53 43 41 4c 41 52 20 53 55 42 51 55 45  "%sSCALAR SUBQUE
18200 52 59 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RY",.           
18210 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
18220 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20  ?"":"CORRELATED 
18230 22 29 29 3b 0a 20 20 20 20 20 20 6e 52 65 67 20  "));.      nReg 
18240 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  = pExpr->op==TK_
18250 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70  SELECT ? pSel->p
18260 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31  EList->nExpr : 1
18270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
18280 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
18290 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  est, 0, pParse->
182a0 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70  nMem+1);.      p
182b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
182c0 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Reg;.      if( p
182d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
182e0 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ECT ){.        d
182f0 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
18300 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73  Mem;.        des
18310 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69  t.iSdst = dest.i
18320 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20  SDParm;.        
18330 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65  dest.nSdst = nRe
18340 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  g;.        sqlit
18350 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
18360 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74  OP_Null, 0, dest
18370 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69  .iSDParm, dest.i
18380 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a  SDParm+nReg-1);.
18390 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
183a0 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75  ent((v, "Init su
183b0 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
183c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
183d0 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
183e0 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a  t = SRT_Exists;.
183f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18400 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18410 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74  Integer, 0, dest
18420 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  .iSDParm);.     
18430 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
18440 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20  v, "Init EXISTS 
18450 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
18460 20 7d 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20   }.      pLimit 
18470 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
18480 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54  oc(pParse->db, T
18490 4b 5f 49 4e 54 45 47 45 52 2c 26 73 71 6c 69 74  K_INTEGER,&sqlit
184a0 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20  e3IntTokens[1], 
184b0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
184c0 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  el->pLimit ){.  
184d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
184e0 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
184f0 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
18500 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
18510 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e    pSel->pLimit->
18520 70 4c 65 66 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  pLeft = pLimit;.
18530 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18540 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
18550 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
18560 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49  (pParse, TK_LIMI
18570 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20  T, pLimit, 0);. 
18580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65       }.      pSe
18590 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  l->iLimit = 0;. 
185a0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
185b0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
185c0 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  Sel, &dest) ){. 
185d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
185e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
185f0 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Reg = dest.iSDPa
18600 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65  rm;.      ExprSe
18610 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
18620 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
18630 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18640 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
18650 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a  rHasNullFlag ){.
18660 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
18670 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78  sNullFlag(v, pEx
18680 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73  pr->iTable, rHas
18690 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a  NullFlag);.  }..
186a0 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d    if( jmpIfDynam
186b0 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ic>=0 ){.    sql
186c0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
186d0 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  (v, jmpIfDynamic
186e0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
186f0 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20   rReg;.}.#endif 
18700 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
18710 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
18720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18730 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45  SUBQUERY./*.** E
18740 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49 4e  xpr pIn is an IN
18750 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
18760 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
18770 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
18780 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  .** sub-select o
18790 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
187a0 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20 68   IN() operator h
187b0 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  as the same numb
187c0 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e  er of .** column
187d0 73 20 61 73 20 74 68 65 20 76 65 63 74 6f 72 20  s as the vector 
187e0 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20  on the LHS. Or, 
187f0 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
18800 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a  e IN() is not .*
18810 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20 74  * a sub-query, t
18820 68 61 74 20 74 68 65 20 4c 48 53 20 69 73 20 61  hat the LHS is a
18830 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20   vector of size 
18840 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
18850 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61 72  3ExprCheckIN(Par
18860 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
18870 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56   *pIn){.  int nV
18880 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
18890 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 49  xprVectorSize(pI
188a0 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  n->pLeft);.  if(
188b0 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45   (pIn->flags & E
188c0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
188d0 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 21      if( nVector!
188e0 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  =pIn->x.pSelect-
188f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
18900 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
18910 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
18920 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65  arse, pIn->x.pSe
18930 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
18940 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  xpr, nVector);. 
18950 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
18960 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
18970 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20   nVector!=1 ){. 
18980 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72     sqlite3Vector
18990 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
189a0 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20   pIn->pLeft);.  
189b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
189c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
189d0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
189e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
189f0 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
18a00 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e  e code for an IN
18a10 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
18a20 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  **      x IN (SE
18a30 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20  LECT ...).**    
18a40 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76    x IN (value, v
18a50 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  alue, ...).**.**
18a60 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
18a70 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73  ide (LHS) is a s
18a80 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f 72 20  calar or vector 
18a90 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
18aa0 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20   .** right-hand 
18ab0 73 69 64 65 20 28 52 48 53 29 20 69 73 20 61 6e  side (RHS) is an
18ac0 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f   array of zero o
18ad0 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20 76 61  r more scalar va
18ae0 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75  lues, or a.** su
18af0 62 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20  bquery.  If the 
18b00 52 48 53 20 69 73 20 61 20 73 75 62 71 75 65 72  RHS is a subquer
18b10 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
18b20 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
18b30 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68  must.** match th
18b40 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
18b50 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f  mns in the vecto
18b60 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20 49  r on the LHS.  I
18b70 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a 2a 20  f the RHS is.** 
18b80 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
18b90 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62  , the LHS must b
18ba0 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a  e a scalar. .**.
18bb0 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  ** The IN operat
18bc0 6f 72 20 69 73 20 74 72 75 65 20 69 66 20 74 68  or is true if th
18bd0 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73 20 63  e LHS value is c
18be0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
18bf0 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20  the RHS..** The 
18c00 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20  result is false 
18c10 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 64 65  if the LHS is de
18c20 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20  finitely not in 
18c30 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 0a 2a  the RHS.  The .*
18c40 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  * result is NULL
18c50 20 69 66 20 74 68 65 20 70 72 65 73 65 6e 63 65   if the presence
18c60 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 74   of the LHS in t
18c70 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20 62 65  he RHS cannot be
18c80 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
18c90 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a  due to NULLs..**
18ca0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18cb0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
18cc0 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65  that jumps to de
18cd0 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65  stIfFalse if the
18ce0 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20   LHS is not .** 
18cf0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
18d00 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75   the RHS.  If du
18d10 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61  e to NULLs we ca
18d20 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69  nnot determine i
18d30 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20  f the LHS.** is 
18d40 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
18d50 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74   RHS then jump t
18d60 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
18d70 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
18d80 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  tained.** within
18d90 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61   the RHS then fa
18da0 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a  ll through..**.*
18db0 2a 20 53 65 65 20 74 68 65 20 73 65 70 61 72 61  * See the separa
18dc0 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d  te in-operator.m
18dd0 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  d documentation 
18de0 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61 6e 6f  file in the cano
18df0 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20  nical.** SQLite 
18e00 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f 72 20  source tree for 
18e10 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
18e20 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
18e30 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
18e40 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73  prCodeIN(.  Pars
18e50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18e60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
18e70 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
18e80 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
18e90 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
18ea0 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78      /* The IN ex
18eb0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
18ec0 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20  t destIfFalse,  
18ed0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
18ee0 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63   if LHS is not c
18ef0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
18f00 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  RHS */.  int des
18f10 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f  tIfNull        /
18f20 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
18f30 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  he results are u
18f40 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55  nknown due to NU
18f50 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  LLs */.){.  int 
18f60 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
18f70 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
18f80 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48  at is true if RH
18f90 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  S contains NULL 
18fa0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
18fb0 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  eType;          
18fc0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65    /* Type of the
18fd0 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c   RHS */.  int rL
18fe0 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
18ff0 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29 20 68  /* Register(s) h
19000 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53 20 76  olding the LHS v
19010 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  alues */.  int r
19020 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20 20 20  LhsOrig;        
19030 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73 20 70   /* LHS values p
19040 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65 72 69  rior to reorderi
19050 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f  ng by aiMap[] */
19060 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
19070 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
19080 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
19090 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
190a0 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20  t *aiMap = 0;   
190b0 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20      /* Map from 
190c0 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20  vector field to 
190d0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  index column */.
190e0 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30    char *zAff = 0
190f0 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e  ;       /* Affin
19100 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63  ity string for c
19110 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20  omparisons */.  
19120 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20  int nVector;    
19130 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19140 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69   vectors for thi
19150 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  s IN operator */
19160 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20  .  int iDummy;  
19170 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d           /* Dumm
19180 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 65  y parameter to e
19190 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 29 20  xprCodeVector() 
191a0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
191b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
191c0 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
191d0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
191e0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
191f0 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e      /* loop coun
19200 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ter */.  int des
19210 74 53 74 65 70 32 3b 20 20 20 20 20 20 20 20 2f  tStep2;        /
19220 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
19230 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20  when NULLs seen 
19240 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20 20 69  in step 2 */.  i
19250 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d 20 30  nt destStep6 = 0
19260 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ;    /* Start of
19270 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70 20 36   code for Step 6
19280 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 72   */.  int addrTr
19290 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41  uthOp;      /* A
192a0 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f 64 65  ddress of opcode
192b0 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
192c0 20 74 68 65 20 49 4e 20 69 73 20 74 72 75 65 20   the IN is true 
192d0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f 74  */.  int destNot
192e0 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75  Null;      /* Ju
192f0 6d 70 20 68 65 72 65 20 69 66 20 61 20 63 6f 6d  mp here if a com
19300 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74  parison is not t
19310 72 75 65 20 69 6e 20 73 74 65 70 20 36 20 2a 2f  rue in step 6 */
19320 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
19330 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
19340 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20 6c 6f  of the step-6 lo
19350 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20  op */ ..  pLeft 
19360 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
19370 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
19380 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c  rCheckIN(pParse,
19390 20 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e   pExpr) ) return
193a0 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49  ;.  zAff = exprI
193b0 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  NAffinity(pParse
193c0 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63  , pExpr);.  nVec
193d0 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tor = sqlite3Exp
193e0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
193f0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d  r->pLeft);.  aiM
19400 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ap = (int*)sqlit
19410 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  e3DbMallocZero(.
19420 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
19430 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f  , nVector*(sizeo
19440 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28  f(int) + sizeof(
19450 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a  char)) + 1.  );.
19460 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
19470 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19480 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
19490 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f  rCodeIN_oom_erro
194a0 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74  r;..  /* Attempt
194b0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
194c0 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73 20  RHS. After this 
194d0 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e  step, if anythin
194e0 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a  g other than.  *
194f0 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  * IN_INDEX_NOOP 
19500 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
19510 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69 74   table opened it
19520 68 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d 3e  h cursor pExpr->
19530 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e  iTable .  ** con
19540 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
19550 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
19560 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44  e RHS. If IN_IND
19570 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72  EX_NOOP is retur
19580 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48  ned,.  ** the RH
19590 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  S has not yet be
195a0 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20  en coded.  */.  
195b0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
195c0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
195d0 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f  0 );       /* OO
195e0 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72  M detected prior
195f0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
19600 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
19610 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
19620 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65   IN expr"));.  e
19630 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
19640 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
19650 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  , pExpr,.       
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d        IN_INDEX_M
19680 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49  EMBERSHIP | IN_I
19690 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20  NDEX_NOOP_OK,.  
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196b0 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74 49             destI
196c0 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
196d0 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61  ll ? 0 : &rRhsHa
196e0 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a  sNull, aiMap);..
196f0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
19700 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f  ->nErr || nVecto
19710 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49  r==1 || eType==I
19720 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20  N_INDEX_EPH.    
19730 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f     || eType==IN_
19740 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
19750 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
19760 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20  EX_INDEX_DESC . 
19770 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
19780 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e  E_DEBUG.  /* Con
19790 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b  firm that aiMap[
197a0 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74  ] contains nVect
197b0 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  or integer value
197c0 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a  s between 0 and.
197d0 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20    ** nVector-1. 
197e0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
197f0 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
19800 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20     int j, cnt;. 
19810 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20     for(cnt=j=0; 
19820 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20  j<nVector; j++) 
19830 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20  if( aiMap[j]==i 
19840 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73  ) cnt++;.    ass
19850 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20  ert( cnt==1 );. 
19860 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
19870 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68  Code the LHS, th
19880 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c  e <expr> from "<
19890 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e  expr> IN (...)".
198a0 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 61   If the LHS is a
198b0 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74   .  ** vector, t
198c0 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64  hen it is stored
198d0 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
198e0 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74 65 72  nVector register
198f0 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a  s starting .  **
19900 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a   at r1..  **.  *
19910 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  * sqlite3FindInI
19920 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68 61 76  ndex() might hav
19930 65 20 72 65 6f 72 64 65 72 65 64 20 74 68 65 20  e reordered the 
19940 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48  fields of the LH
19950 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f  S vector.  ** so
19960 20 74 68 61 74 20 74 68 65 20 66 69 65 6c 64 73   that the fields
19970 20 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65   are in the same
19980 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65 78 69   order as an exi
19990 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54  sting index.   T
199a0 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20  he.  ** aiMap[] 
199b0 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61  array contains a
199c0 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68   mapping from th
199d0 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66  e original LHS f
199e0 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20  ield order to.  
199f0 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64  ** the field ord
19a00 65 72 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  er that matches 
19a10 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20  the RHS index.. 
19a20 20 2a 2f 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d   */.  rLhsOrig =
19a30 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
19a40 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
19a50 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69  iDummy);.  for(i
19a60 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26  =0; i<nVector &&
19a70 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b   aiMap[i]==i; i+
19a80 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20  +){} /* Are LHS 
19a90 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64  fields reordered
19aa0 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56  ? */.  if( i==nV
19ab0 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20  ector ){.    /* 
19ac0 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e  LHS fields are n
19ad0 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a  ot reordered */.
19ae0 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f      rLhs = rLhsO
19af0 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rig;.  }else{.  
19b00 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f    /* Need to reo
19b10 72 64 65 72 20 74 68 65 20 4c 48 53 20 66 69 65  rder the LHS fie
19b20 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  lds according to
19b30 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c   aiMap */.    rL
19b40 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  hs = sqlite3GetT
19b50 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
19b60 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66   nVector);.    f
19b70 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
19b80 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
19b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19ba0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68  (v, OP_Copy, rLh
19bb0 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69  sOrig+i, rLhs+ai
19bc0 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20  Map[i], 0);.    
19bd0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
19be0 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
19bf0 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64  x() did not find
19c00 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e   or create an in
19c10 64 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  dex that is.  **
19c20 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76   suitable for ev
19c30 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20  aluating the IN 
19c40 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65  operator, then e
19c50 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a  valuate using a.
19c60 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66    ** sequence of
19c70 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20   comparisons..  
19c80 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
19c90 73 74 65 70 20 28 31 29 20 69 6e 20 74 68 65 20  step (1) in the 
19ca0 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f  in-operator.md o
19cb0 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74  ptimized algorit
19cc0 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  hm..  */.  if( e
19cd0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e  Type==IN_INDEX_N
19ce0 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  OOP ){.    ExprL
19cf0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
19d00 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
19d10 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
19d20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
19d30 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
19d40 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
19d50 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71  int labelOk = sq
19d60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19d70 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72  el(v);.    int r
19d80 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20  2, regToFree;.  
19d90 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20    int regCkNull 
19da0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b  = 0;.    int ii;
19db0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
19dc0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
19dd0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
19de0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65  t) );.    if( de
19df0 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66  stIfNull!=destIf
19e00 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72  False ){.      r
19e10 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  egCkNull = sqlit
19e20 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
19e30 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
19e40 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19e50 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73   OP_BitAnd, rLhs
19e60 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c  , rLhs, regCkNul
19e70 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  l);.    }.    fo
19e80 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74  r(ii=0; ii<pList
19e90 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
19ea0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
19eb0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
19ec0 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
19ed0 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54  ii].pExpr, &regT
19ee0 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66  oFree);.      if
19ef0 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73  ( regCkNull && s
19f00 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
19f10 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  ull(pList->a[ii]
19f20 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
19f30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f40 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e  dOp3(v, OP_BitAn
19f50 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32  d, regCkNull, r2
19f60 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
19f70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19f80 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
19f90 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21  1 || destIfNull!
19fa0 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
19fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19fc0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
19fd0 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f  Eq, rLhs, labelO
19fe0 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  k, r2,.         
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a000 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
1a010 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
1a020 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a030 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e  If(v, ii<pList->
1a040 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
1a050 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a060 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e  (v, ii==pList->n
1a070 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20  Expr-1);.       
1a080 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1a090 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29  geP5(v, zAff[0])
1a0a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a0b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
1a0c0 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
1a0d0 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20  fFalse );.      
1a0e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a0f0 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c  Op4(v, OP_Ne, rL
1a100 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  hs, destIfFalse,
1a110 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a130 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
1a140 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f  COLLSEQ); VdbeCo
1a150 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1a160 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1a170 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30  angeP5(v, zAff[0
1a180 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ] | SQLITE_JUMPI
1a190 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
1a1a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1a1b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a1c0 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a  se, regToFree);.
1a1d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
1a1e0 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  gCkNull ){.     
1a1f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a200 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
1a210 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74   regCkNull, dest
1a220 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76  IfNull); VdbeCov
1a230 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1a240 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1a250 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1a260 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1a270 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1a280 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a  el(v, labelOk);.
1a290 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1a2a0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1a2b0 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
1a2c0 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78    goto sqlite3Ex
1a2d0 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
1a2e0 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  d;.  }..  /* Ste
1a2f0 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65  p 2: Check to se
1a300 65 20 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e  e if the LHS con
1a310 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63  tains any NULL c
1a320 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a  olumns.  If the.
1a330 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f    ** LHS does co
1a340 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e  ntain NULLs then
1a350 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   the result must
1a360 20 62 65 20 65 69 74 68 65 72 20 46 41 4c 53 45   be either FALSE
1a370 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57   or NULL..  ** W
1a380 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70  e will then skip
1a390 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72   the binary sear
1a3a0 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20  ch of the RHS.. 
1a3b0 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66   */.  if( destIf
1a3c0 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
1a3d0 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65  e ){.    destSte
1a3e0 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65  p2 = destIfFalse
1a3f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1a400 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 53  estStep2 = destS
1a410 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64  tep6 = sqlite3Vd
1a420 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1a430 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1a440 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1a450 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
1a460 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
1a470 53 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70  Subexpr(pExpr->p
1a480 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 69 66  Left, i);.    if
1a490 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
1a4a0 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20  BeNull(p) ){.   
1a4b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a4c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
1a4d0 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 53  l, rLhs+i, destS
1a4e0 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56 64 62  tep2);.      Vdb
1a4f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a500 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74    }.  }..  /* St
1a510 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53 20 69  ep 3.  The LHS i
1a520 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62  s now known to b
1a530 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20  e non-NULL.  Do 
1a540 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
1a550 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48  h.  ** of the RH
1a560 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48 53 20  S using the LHS 
1a570 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49 66 20  as a probe.  If 
1a580 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73 75 6c  found, the resul
1a590 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a  t is.  ** true..
1a5a0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1a5b0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
1a5c0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
1a5d0 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
1a5e0 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66   is the ROWID of
1a5f0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e   table b-tree an
1a600 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20  d so we also.   
1a610 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   ** know that th
1a620 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c  e RHS is non-NUL
1a630 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 63 6f  L.  Hence, we co
1a640 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20 61 6e  mbine steps 3 an
1a650 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  d 4.    ** into 
1a660 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
1a670 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
1a680 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1a690 53 65 65 6b 52 6f 77 69 64 2c 20 70 45 78 70 72  SeekRowid, pExpr
1a6a0 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
1a6b0 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20  False, rLhs);.  
1a6c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1a6d0 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74 68  );.    addrTruth
1a6e0 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
1a6f0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
1a700 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54  o);  /* Return T
1a710 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  rue */.  }else{.
1a720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a730 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
1a740 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63  nity, rLhs, nVec
1a750 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56  tor, 0, zAff, nV
1a760 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ector);.    if( 
1a770 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
1a780 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  tIfNull ){.     
1a790 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70   /* Combine Step
1a7a0 20 33 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e   3 and Step 5 in
1a7b0 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  to a single opco
1a7c0 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  de */.      sqli
1a7d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1a7e0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
1a7f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1a800 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20  destIfFalse,.   
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56          rLhs, nV
1a830 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65  ector); VdbeCove
1a840 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67  rage(v);.      g
1a850 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
1a860 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a  odeIN_finished;.
1a870 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64      }.    /* Ord
1a880 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f  inary Step 3, fo
1a890 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  r the case where
1a8a0 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20   FALSE and NULL 
1a8b0 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
1a8c0 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20      addrTruthOp 
1a8d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a8e0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
1a8f0 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
1a900 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  e, 0,.          
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a920 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73              rLhs
1a930 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65  , nVector); Vdbe
1a940 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
1a950 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20  ..  /* Step 4.  
1a960 49 66 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e  If the RHS is kn
1a970 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55  own to be non-NU
1a980 4c 4c 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f  LL and we did no
1a990 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d  t find.  ** an m
1a9a0 61 74 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72  atch on the sear
1a9b0 63 68 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74  ch above, then t
1a9c0 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62  he result must b
1a9d0 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20  e FALSE..  */.  
1a9e0 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  if( rRhsHasNull 
1a9f0 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b  && nVector==1 ){
1aa00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1aa10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
1aa20 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c  Null, rRhsHasNul
1aa30 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  l, destIfFalse);
1aa40 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1aa50 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(v);.  }..  /* 
1aa60 53 74 65 70 20 35 2e 20 20 49 66 20 77 65 20 64  Step 5.  If we d
1aa70 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
1aa80 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
1aa90 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64  between NULL and
1aaa0 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65  .  ** FALSE, the
1aab0 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61  n just return fa
1aac0 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  lse. .  */.  if(
1aad0 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
1aae0 73 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74  stIfNull ) sqlit
1aaf0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
1ab00 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f  stIfFalse);..  /
1ab10 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74  * Step 6: Loop t
1ab20 68 72 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74  hrough rows of t
1ab30 68 65 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65  he RHS.  Compare
1ab40 20 65 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65   each row to the
1ab50 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e   LHS..  ** If an
1ab60 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  y comparison is 
1ab70 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72  NULL, then the r
1ab80 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20  esult is NULL.  
1ab90 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70  If all.  ** comp
1aba0 61 72 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53  arisons are FALS
1abb0 45 20 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c  E then the final
1abc0 20 72 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45   result is FALSE
1abd0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  ..  **.  ** For 
1abe0 61 20 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74  a scalar LHS, it
1abf0 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74   is sufficient t
1ac00 6f 20 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65  o check just the
1ac10 20 66 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20   first row.  ** 
1ac20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f  of the RHS..  */
1ac30 0a 20 20 69 66 28 20 64 65 73 74 53 74 65 70 36  .  if( destStep6
1ac40 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   ) sqlite3VdbeRe
1ac50 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1ac60 73 74 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72  stStep6);.  addr
1ac70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
1ac80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
1ac90 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  wind, pExpr->iTa
1aca0 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
1acb0 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
1acc0 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63  e(v);.  if( nVec
1acd0 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73  tor>1 ){.    des
1ace0 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  tNotNull = sqlit
1acf0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1ad00 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
1ad10 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d   /* For nVector=
1ad20 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65 70  =1, combine step
1ad30 73 20 36 20 61 6e 64 20 37 20 62 79 20 69 6d 6d  s 6 and 7 by imm
1ad40 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 69  ediately returni
1ad50 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45 20  ng.    ** FALSE 
1ad60 69 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d  if the first com
1ad70 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e  parison is not N
1ad80 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e  ULL */.    destN
1ad90 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66 46  otNull = destIfF
1ada0 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  alse;.  }.  for(
1adb0 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
1adc0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
1add0 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  p;.    CollSeq *
1ade0 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72  pColl;.    int r
1adf0 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  3 = sqlite3GetTe
1ae00 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1ae10 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 56 65     p = sqlite3Ve
1ae20 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
1ae30 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  (pLeft, i);.    
1ae40 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1ae50 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1ae60 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, p);.    sqlit
1ae70 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1ae80 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72  OP_Column, pExpr
1ae90 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72 33 29  ->iTable, i, r3)
1aea0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1aeb0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
1aec0 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f  , rLhs+i, destNo
1aed0 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20  tNull, r3,.     
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aef0 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
1af00 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
1af10 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1af20 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1af30 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1af40 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71  e, r3);.  }.  sq
1af50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1af60 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
1af70 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66  estIfNull);.  if
1af80 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20  ( nVector>1 ){. 
1af90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1afa0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1afb0 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20  stNotNull);.    
1afc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1afd0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 45  2(v, OP_Next, pE
1afe0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64  xpr->iTable, add
1aff0 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64 62  rTop+1);.    Vdb
1b000 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1b010 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49     /* Step 7:  I
1b020 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
1b030 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
1b040 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hat the result m
1b050 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66 61  ust.    ** be fa
1b060 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  lse. */.    sqli
1b070 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b080 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
1b090 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a  tIfFalse);.  }..
1b0a0 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65 20    /* Jumps here 
1b0b0 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74 75  in order to retu
1b0c0 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71  rn true. */.  sq
1b0d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1b0e0 65 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f 70  e(v, addrTruthOp
1b0f0 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72 43  );..sqlite3ExprC
1b100 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a  odeIN_finished:.
1b110 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68 73    if( rLhs!=rLhs
1b120 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33 52 65  Orig ) sqlite3Re
1b130 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1b140 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 56 64  rse, rLhs);.  Vd
1b150 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
1b160 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 73  nd IN expr"));.s
1b170 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
1b180 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71  _oom_error:.  sq
1b190 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1b1a0 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a  se->db, aiMap);.
1b1b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1b1c0 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66  pParse->db, zAff
1b1d0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
1b1e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1b1f0 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
1b200 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1b210 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a  TING_POINT./*.**
1b220 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
1b230 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
1b240 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74  ll put the float
1b250 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
1b260 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ue described by 
1b270 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
1b280 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
1b290 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
1b2a0 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
1b2b0 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
1b2c0 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
1b2d0 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
1b2e0 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
1b2f0 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
1b300 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
1b310 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
1b320 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
1b330 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
1b340 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
1b350 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63  eReal(Vdbe *v, c
1b360 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
1b370 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e  t negateFlag, in
1b380 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41  t iMem){.  if( A
1b390 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20  LWAYS(z!=0) ){. 
1b3a0 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b     double value;
1b3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
1b3c0 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69  (z, &value, sqli
1b3d0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
1b3e0 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
1b3f0 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
1b400 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29  e3IsNaN(value) )
1b410 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f  ; /* The new Ato
1b420 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20  F never returns 
1b430 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  NaN */.    if( n
1b440 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75  egateFlag ) valu
1b450 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20  e = -value;.    
1b460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b470 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c  4Dup8(v, OP_Real
1b480 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75  , 0, iMem, 0, (u
1b490 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45  8*)&value, P4_RE
1b4a0 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
1b4b0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  f.../*.** Genera
1b4c0 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
1b4d0 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
1b4e0 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
1b4f0 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
1b500 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
1b510 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
1b520 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  .** Expr.u.zToke
1b530 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38  n is always UTF8
1b540 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e   and zero-termin
1b550 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
1b560 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
1b570 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b580 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1b590 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d   negFlag, int iM
1b5a0 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  em){.  Vdbe *v =
1b5b0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1b5c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
1b5d0 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
1b5e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
1b5f0 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b  pExpr->u.iValue;
1b600 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
1b610 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67  0 );.    if( neg
1b620 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20  Flag ) i = -i;. 
1b630 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b640 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1b650 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
1b660 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63  }else{.    int c
1b670 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b  ;.    i64 value;
1b680 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1b690 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  *z = pExpr->u.zT
1b6a0 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  oken;.    assert
1b6b0 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20  ( z!=0 );.    c 
1b6c0 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  = sqlite3DecOrHe
1b6d0 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65  xToI64(z, &value
1b6e0 29 3b 0a 20 20 20 20 69 66 28 20 28 63 3d 3d 33  );.    if( (c==3
1b6f0 20 26 26 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c   && !negFlag) ||
1b700 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e 65 67 46   (c==2) || (negF
1b710 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d  lag && value==SM
1b720 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a  ALLEST_INT64)){.
1b730 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
1b740 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1b750 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  T.      sqlite3E
1b760 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b770 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67  "oversized integ
1b780 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c  er: %s%s", negFl
1b790 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a  ag ? "-" : "", z
1b7a0 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66  );.#else.#ifndef
1b7b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58   SQLITE_OMIT_HEX
1b7c0 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69  _INTEGER.      i
1b7d0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
1b7e0 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30  cmp(z,"0x",2)==0
1b7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b800 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1b810 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c  se, "hex literal
1b820 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c   too big: %s%s",
1b830 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c   negFlag?"-":"",
1b840 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  z);.      }else.
1b850 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
1b860 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
1b870 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69  v, z, negFlag, i
1b880 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Mem);.      }.#e
1b890 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
1b8a0 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61        if( negFla
1b8b0 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d  g ){ value = c==
1b8c0 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  3 ? SMALLEST_INT
1b8d0 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20  64 : -value; }. 
1b8e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b8f0 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
1b900 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c  _Int64, 0, iMem,
1b910 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c   0, (u8*)&value,
1b920 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20   P4_INT64);.    
1b930 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e  }.  }.}.../* Gen
1b940 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1b950 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72  will load into r
1b960 65 67 69 73 74 65 72 20 72 65 67 4f 75 74 20 61  egister regOut a
1b970 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a   value that is.*
1b980 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  * appropriate fo
1b990 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68  r the iIdxCol-th
1b9a0 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
1b9b0 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73   pIdx..*/.void s
1b9c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f  qlite3ExprCodeLo
1b9d0 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20  adIndexColumn(. 
1b9e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1b9f0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1ba00 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
1ba10 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20  ex *pIdx,    /* 
1ba20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
1ba30 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20  column is to be 
1ba40 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
1ba50 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43  iTabCur,    /* C
1ba60 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1ba70 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f  o a table row */
1ba80 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20  .  int iIdxCol, 
1ba90 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
1baa0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
1bab0 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20   be loaded */.  
1bac0 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
1bad0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64  /* Store the ind
1bae0 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  ex column value 
1baf0 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1bb00 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61   */.){.  i16 iTa
1bb10 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  bCol = pIdx->aiC
1bb20 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a  olumn[iIdxCol];.
1bb30 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58    if( iTabCol==X
1bb40 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73  N_EXPR ){.    as
1bb50 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c  sert( pIdx->aCol
1bb60 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65  Expr );.    asse
1bb70 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  rt( pIdx->aColEx
1bb80 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f  pr->nExpr>iIdxCo
1bb90 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  l );.    pParse-
1bba0 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62  >iSelfTab = iTab
1bbb0 43 75 72 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c  Cur + 1;.    sql
1bbc0 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
1bbd0 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61  (pParse, pIdx->a
1bbe0 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43  ColExpr->a[iIdxC
1bbf0 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f 75  ol].pExpr, regOu
1bc00 74 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  t);.    pParse->
1bc10 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20  iSelfTab = 0;.  
1bc20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1bc30 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1bc40 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73  umnOfTable(pPars
1bc50 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e  e->pVdbe, pIdx->
1bc60 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c  pTable, iTabCur,
1bc70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65       iTabCol, re
1bca0 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
1bcb0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1bcc0 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
1bcd0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43   value of the iC
1bce0 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
1bcf0 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
1bd00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bd10 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1bd20 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
1bd30 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
1bd40 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1bd50 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  on */.  Table *p
1bd60 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Tab,    /* The t
1bd70 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
1bd80 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  the value */.  i
1bd90 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f  nt iTabCur,    /
1bda0 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73  * The table curs
1bdb0 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63  or.  Or the PK c
1bdc0 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55  ursor for WITHOU
1bdd0 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74  T ROWID */.  int
1bde0 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20   iCol,       /* 
1bdf0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
1be00 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a  umn to extract *
1be10 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20  /.  int regOut  
1be20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
1be30 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  he value into th
1be40 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
1be50 7b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  {.  if( pTab==0 
1be60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1be70 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1be80 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c 20  olumn, iTabCur, 
1be90 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
1bea0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1beb0 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69   if( iCol<0 || i
1bec0 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  Col==pTab->iPKey
1bed0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1bee0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1bef0 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20  Rowid, iTabCur, 
1bf00 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  regOut);.  }else
1bf10 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49  {.    int op = I
1bf20 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
1bf30 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50   OP_VColumn : OP
1bf40 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74  _Column;.    int
1bf50 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69   x = iCol;.    i
1bf60 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
1bf70 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  b) && !IsVirtual
1bf80 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
1bf90 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
1bfa0 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33  nOfIndex(sqlite3
1bfb0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1bfc0 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20  pTab), iCol);.  
1bfd0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1bfe0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1bff0 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67   iTabCur, x, reg
1c000 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
1c010 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
1c020 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
1c030 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
1c040 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
1c050 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1c060 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1c070 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
1c080 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
1c090 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
1c0a0 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
1c0b0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1c0c0 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a  a register. .**.
1c0d0 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69 73 20  ** An effort is 
1c0e0 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  made to store th
1c0f0 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1c100 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  n register iReg.
1c110 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74    This.** is not
1c120 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f 72 20   garanteeed for 
1c130 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68  GetColumn() - th
1c140 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62 65 20  e result can be 
1c150 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79  stored in.** any
1c160 20 72 65 67 69 73 74 65 72 2e 20 20 42 75 74 20   register.  But 
1c170 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67 75  the result is gu
1c180 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64  aranteed to land
1c190 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1c1a0 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75  g.** for GetColu
1c1b0 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a  mnToReg()..**.**
1c1c0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1c1d0 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
1c1e0 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
1c1f0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1c200 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
1c210 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
1c220 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
1c230 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
1c240 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f  ts the rowid..*/
1c250 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1c260 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20  CodeGetColumn(. 
1c270 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1c280 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1c290 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1c2a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1c2b0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1c2c0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1c2d0 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1c2e0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1c2f0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1c300 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1c310 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1c320 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1c330 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1c340 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1c350 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1c360 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20   int iReg,      
1c370 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1c380 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20  ts here */.  u8 
1c390 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p5            /*
1c3a0 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50   P5 value for OP
1c3b0 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20  _Column + FLAGS 
1c3c0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
1c3d0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1c3e0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
1c3f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1c400 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1c410 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54  able(v, pTab, iT
1c420 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
1c430 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29  Reg);.  if( p5 )
1c440 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1c450 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29  eChangeP5(v, p5)
1c460 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1c470 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  Reg;.}.void sqli
1c480 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1c490 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61 72  lumnToReg(.  Par
1c4a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1c4b0 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1c4c0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1c4d0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1c4e0 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1c4f0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1c500 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1c510 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1c520 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1c530 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1c540 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1c550 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1c560 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1c570 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1c580 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1c590 20 69 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a   iReg         /*
1c5a0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1c5b0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1c5c0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1c5d0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
1c5e0 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c  arse, pTab, iCol
1c5f0 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52 65  umn, iTable, iRe
1c600 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31 21  g, 0);.  if( r1!
1c610 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65 33 56  =iReg ) sqlite3V
1c620 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
1c630 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
1c640 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a  y, r1, iReg);.}.
1c650 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c660 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e  code to move con
1c670 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
1c680 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
1c690 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
1c6a0 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
1c6b0 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f  g-1. Keep the co
1c6c0 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f  lumn cache up-to
1c6d0 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  -date..*/.void s
1c6e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
1c6f0 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
1c700 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
1c710 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b   iTo, int nReg){
1c720 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d  .  assert( iFrom
1c730 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46  >=iTo+nReg || iF
1c740 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b  rom+nReg<=iTo );
1c750 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1c760 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
1c770 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
1c780 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
1c790 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
1c7a0 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
1c7b0 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54  sion node to a T
1c7c0 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66 65 72  K_REGISTER refer
1c7d0 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74  encing.** regist
1c7e0 65 72 20 69 52 65 67 2e 20 20 54 68 65 20 63 61  er iReg.  The ca
1c7f0 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
1c800 20 74 68 61 74 20 69 52 65 67 20 61 6c 72 65 61   that iReg alrea
1c810 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  dy contains.** t
1c820 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
1c830 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
1c840 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1c850 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73 74  oid exprToRegist
1c860 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
1c870 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20  iReg){.  p->op2 
1c880 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70  = p->op;.  p->op
1c890 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
1c8a0 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52    p->iTable = iR
1c8b0 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50  eg;.  ExprClearP
1c8c0 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b  roperty(p, EP_Sk
1c8d0 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76  ip);.}../*.** Ev
1c8e0 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
1c8f0 73 69 6f 6e 20 28 65 69 74 68 65 72 20 61 20 76  sion (either a v
1c900 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61  ector or a scala
1c910 72 20 65 78 70 72 65 73 73 69 6f 6e 29 20 61 6e  r expression) an
1c920 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72  d store.** the r
1c930 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67  esult in conting
1c940 75 6f 75 73 20 74 65 6d 70 6f 72 61 72 79 20 72  uous temporary r
1c950 65 67 69 73 74 65 72 73 2e 20 20 52 65 74 75 72  egisters.  Retur
1c960 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
1c970 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  * the first regi
1c980 73 74 65 72 20 75 73 65 64 20 74 6f 20 73 74 6f  ster used to sto
1c990 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  re the result..*
1c9a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75  *.** If the retu
1c9b0 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69  rned result regi
1c9c0 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
1c9d0 61 72 79 20 73 63 61 6c 61 72 2c 20 74 68 65 6e  ary scalar, then
1c9e0 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74   also write.** t
1c9f0 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d  hat register num
1ca00 62 65 72 20 69 6e 74 6f 20 2a 70 69 46 72 65 65  ber into *piFree
1ca10 61 62 6c 65 2e 20 20 49 66 20 74 68 65 20 72 65  able.  If the re
1ca20 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65  turned result re
1ca30 67 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74  gister.** is not
1ca40 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
1ca50 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1ca60 6e 20 69 73 20 61 20 76 65 63 74 6f 72 20 73 65  n is a vector se
1ca70 74 20 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a  t *piFreeable.**
1ca80 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 0..*/.static
1ca90 20 69 6e 74 20 65 78 70 72 43 6f 64 65 56 65 63   int exprCodeVec
1caa0 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
1cab0 65 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  e, Expr *p, int 
1cac0 2a 70 69 46 72 65 65 61 62 6c 65 29 7b 0a 20 20  *piFreeable){.  
1cad0 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20 20 69  int iResult;.  i
1cae0 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c  nt nResult = sql
1caf0 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
1cb00 7a 65 28 70 29 3b 0a 20 20 69 66 28 20 6e 52 65  ze(p);.  if( nRe
1cb10 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69  sult==1 ){.    i
1cb20 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
1cb30 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1cb40 72 73 65 2c 20 70 2c 20 70 69 46 72 65 65 61 62  rse, p, piFreeab
1cb50 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
1cb60 20 20 2a 70 69 46 72 65 65 61 62 6c 65 20 3d 20    *piFreeable = 
1cb70 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  0;.    if( p->op
1cb80 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 23  ==TK_SELECT ){.#
1cb90 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  if SQLITE_OMIT_S
1cba0 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 69 52  UBQUERY.      iR
1cbb0 65 73 75 6c 74 20 3d 20 30 3b 0a 23 65 6c 73 65  esult = 0;.#else
1cbc0 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1cbd0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
1cbe0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
1cbf0 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
1cc00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cc10 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 52 65  int i;.      iRe
1cc20 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
1cc30 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61  Mem+1;.      pPa
1cc40 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
1cc50 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  sult;.      for(
1cc60 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20  i=0; i<nResult; 
1cc70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
1cc80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63  lite3ExprCodeFac
1cc90 74 6f 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20  torable(pParse, 
1cca0 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
1ccb0 2e 70 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c  .pExpr, i+iResul
1ccc0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1ccd0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
1cce0 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Result;.}.../*.*
1ccf0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1cd00 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
1cd10 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
1cd20 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
1cd30 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65  xpression.  Atte
1cd40 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  mpt to store the
1cd50 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
1cd60 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a  ster "target"..*
1cd70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
1cd80 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75  ister where resu
1cd90 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  lts are stored..
1cda0 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20  **.** With this 
1cdb0 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69  routine, there i
1cdc0 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74  s no guarantee t
1cdd0 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c  hat results will
1cde0 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e  .** be stored in
1cdf0 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
1ce00 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74  sult might be st
1ce10 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68  ored in some oth
1ce20 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  er.** register i
1ce30 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65  f it is convenie
1ce40 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68  nt to do so.  Th
1ce50 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1ce60 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b  on.** must check
1ce70 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
1ce80 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65   and move the re
1ce90 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73  sults to the des
1cea0 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72  ired.** register
1ceb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1cec0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50  ExprCodeTarget(P
1ced0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1cee0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1cef0 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
1cf00 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1cf10 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e  e;  /* The VM un
1cf20 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1cf30 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
1cf60 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
1cf70 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65  nt inReg = targe
1cf80 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  t;       /* Resu
1cf90 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lts stored in re
1cfa0 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a  gister inReg */.
1cfb0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1cfc0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
1cfd0 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
1cfe0 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
1cff0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
1d000 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20   regFree2 = 0;  
1d010 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
1d020 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
1d030 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1d040 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  er */.  int r1, 
1d050 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
1d060 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67    /* Various reg
1d070 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f  ister numbers */
1d080 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20  .  Expr tempX;  
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d0a0 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73  Temporary expres
1d0b0 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  sion node */.  i
1d0c0 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73  nt p5 = 0;..  as
1d0d0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
1d0e0 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
1d0f0 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
1d100 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  v==0 ){.    asse
1d110 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
1d120 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1d130 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d140 7d 0a 0a 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f  }..expr_code_doo
1d150 76 65 72 3a 0a 20 20 69 66 28 20 70 45 78 70 72  ver:.  if( pExpr
1d160 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
1d170 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
1d180 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
1d190 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
1d1a0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1d1b0 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
1d1c0 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
1d1d0 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
1d1e0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
1d1f0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1d200 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
1d210 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
1d220 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
1d230 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
1d240 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
1d250 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d260 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
1d270 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d280 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20  pCol->iMem;.    
1d290 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
1d2a0 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
1d2b0 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
1d2c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1d2d0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1d2e0 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
1d2f0 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20  IdxPTab,.       
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d310 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1d320 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  rterColumn, targ
1d330 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1d340 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1d350 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68    }.      /* Oth
1d360 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72  erwise, fall thr
1d370 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f  u into the TK_CO
1d380 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20  LUMN case */.   
1d390 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
1d3a0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
1d3b0 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d  nt iTab = pExpr-
1d3c0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69  >iTable;.      i
1d3d0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1d3e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69 78  ty(pExpr, EP_Fix
1d3f0 65 64 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  edCol) ){.      
1d400 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1d410 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1d420 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1d430 65 66 74 2c 74 61 72 67 65 74 29 3b 0a 20 20 20  eft,target);.   
1d440 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
1d450 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Tab<0 ){.       
1d460 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 53 65   if( pParse->iSe
1d470 6c 66 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20  lfTab<0 ){.     
1d480 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69       /* Generati
1d490 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ng CHECK constra
1d4a0 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e  ints or insertin
1d4b0 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69  g into partial i
1d4c0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
1d4d0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
1d4e0 69 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72 73 65  iColumn - pParse
1d4f0 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20  ->iSelfTab;.    
1d500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d510 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61       /* Coding a
1d520 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
1d530 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
1d540 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75  index where colu
1d550 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20  mn names.       
1d560 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64     ** in the ind
1d570 65 78 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ex refer to the 
1d580 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74  table to which t
1d590 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73  he index belongs
1d5a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54   */.          iT
1d5b0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  ab = pParse->iSe
1d5c0 6c 66 54 61 62 20 2d 20 31 3b 0a 20 20 20 20 20  lfTab - 1;.     
1d5d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d5e0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1d5f0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1d600 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
1d610 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
1d640 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72  olumn, iTab, tar
1d650 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b      pExpr->op2);
1d680 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1d690 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
1d6a0 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
1d6b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
1d6c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1d6d0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1d6e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1d6f0 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20 7b 0a 20  K_TRUEFALSE: {. 
1d700 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d710 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1d720 65 67 65 72 2c 20 73 71 6c 69 74 65 33 45 78 70  eger, sqlite3Exp
1d730 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
1d740 72 29 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r), target);.   
1d750 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1d760 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1d770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1d780 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63  TING_POINT.    c
1d790 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
1d7a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1d7b0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d7c0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1d7d0 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  e) );.      code
1d7e0 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75  Real(v, pExpr->u
1d7f0 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67  .zToken, 0, targ
1d800 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1d810 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1d820 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1d830 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
1d840 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1d850 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1d860 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1d870 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d880 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
1d890 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70 72 2d  , target, pExpr-
1d8a0 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1d8b0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1d8c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1d8d0 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
1d8e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d8f0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1d900 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1d910 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1d920 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1d930 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
1d940 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
1d950 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
1d960 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
1d970 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
1d980 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a     char *zBlob;.
1d990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1d9a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d9b0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1d9c0 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
1d9d0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1d9e0 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  ken[0]=='x' || p
1d9f0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1da00 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
1da10 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1da20 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27  .zToken[1]=='\''
1da30 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70   );.      z = &p
1da40 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32  Expr->u.zToken[2
1da50 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ];.      n = sql
1da60 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
1da70 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
1da80 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b  t( z[n]=='\'' );
1da90 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73  .      zBlob = s
1daa0 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
1dab0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
1dac0 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
1dad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1dae0 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32  (v, OP_Blob, n/2
1daf0 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c  , target, 0, zBl
1db00 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ob, P4_DYNAMIC);
1db10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1db20 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
1db30 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
1db40 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
1db50 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1db60 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1db70 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1db80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1db90 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  Expr->u.zToken!=
1dba0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1dbb0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1dbc0 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  en[0]!=0 );.    
1dbd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dbe0 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  Op2(v, OP_Variab
1dbf0 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
1dc00 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
1dc10 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e     if( pExpr->u.
1dc20 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a  zToken[1]!=0 ){.
1dc30 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1dc40 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 56  ar *z = sqlite3V
1dc50 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50  ListNumToName(pP
1dc60 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 70 45  arse->pVList, pE
1dc70 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1dc80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1dc90 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1dca0 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63 6d 70  ]=='?' || strcmp
1dcb0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1dcc0 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  , z)==0 );.     
1dcd0 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
1dce0 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e 64  t[0] = 0; /* Ind
1dcf0 69 63 61 74 65 20 56 4c 69 73 74 20 6d 61 79 20  icate VList may 
1dd00 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65 6e 6c  no longer be enl
1dd10 61 72 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  arged */.       
1dd20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
1dd30 6e 64 50 34 28 76 2c 20 28 63 68 61 72 2a 29 7a  ndP4(v, (char*)z
1dd40 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
1dd50 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1dd60 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1dd70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
1dd80 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ISTER: {.      r
1dd90 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54 61  eturn pExpr->iTa
1dda0 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  ble;.    }.#ifnd
1ddb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1ddc0 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
1ddd0 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
1dde0 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
1ddf0 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
1de00 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
1de10 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20   */.      inReg 
1de20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1de30 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1de40 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
1de50 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1de60 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29   inReg!=target )
1de70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1de80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1de90 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
1dea0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1deb0 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
1dec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1ded0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dee0 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72  (v, OP_Cast, tar
1def0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1df10 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
1df20 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1df30 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 72 65 74  , 0));.      ret
1df40 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d  urn inReg;.    }
1df50 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1df60 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
1df70 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
1df80 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
1df90 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  :.      op = (op
1dfa0 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
1dfb0 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
1dfc0 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  p5 = SQLITE_NULL
1dfd0 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c  EQ;.      /* fal
1dfe0 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l-through */.   
1dff0 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1e000 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1e010 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1e020 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1e030 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1e040 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1e050 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1e060 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
1e070 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1e080 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
1e090 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
1e0a0 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61   codeVectorCompa
1e0b0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1e0c0 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35  , target, op, p5
1e0d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1e0e0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1e0f0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e100 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1e110 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1e120 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1e130 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e140 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1e150 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1e160 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70          codeComp
1e170 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
1e180 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1e190 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1e1a0 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
1e1b0 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
1e1c0 7c 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61  | p5);.        a
1e1d0 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
1e1e0 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
1e1f0 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
1e200 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e210 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Lt);.        a
1e220 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
1e230 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
1e240 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
1e250 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e260 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Le);.        a
1e270 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
1e280 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
1e290 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
1e2a0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e2b0 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Gt);.        a
1e2c0 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
1e2d0 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
1e2e0 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
1e2f0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e300 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Ge);.        a
1e310 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
1e320 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
1e330 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f  ==OP_Eq); VdbeCo
1e340 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e350 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Eq);.        a
1e360 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
1e370 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
1e380 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
1e390 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e3a0 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74  P_Ne);.        t
1e3b0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1e3c0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
1e3d0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1e3e0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
1e3f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e400 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e410 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
1e420 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
1e430 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
1e440 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
1e450 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
1e460 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
1e470 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
1e480 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1e490 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
1e4a0 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
1e4b0 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
1e4c0 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
1e4d0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
1e4e0 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
1e4f0 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41  rt( TK_AND==OP_A
1e500 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  nd );           
1e510 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e520 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  K_AND );.      a
1e530 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
1e540 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20  _Or );          
1e550 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e560 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
1e570 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
1e580 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20  ==OP_Add );     
1e590 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e5a0 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20  op==TK_PLUS );. 
1e5b0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e5c0 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
1e5d0 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61  ct );     testca
1e5e0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53  se( op==TK_MINUS
1e5f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e600 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
1e610 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74  ainder );      t
1e620 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e630 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  REM );.      ass
1e640 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
1e650 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20  OP_BitAnd );    
1e660 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e670 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
1e680 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1e690 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
1e6a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e6b0 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
1e6c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e6d0 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76  TK_SLASH==OP_Div
1e6e0 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73  ide );       tes
1e6f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c  tcase( op==TK_SL
1e700 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ASH );.      ass
1e710 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d  ert( TK_LSHIFT==
1e720 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20  OP_ShiftLeft ); 
1e730 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e740 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_LSHIFT );.   
1e750 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
1e760 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
1e770 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65  ght );  testcase
1e780 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20  ( op==TK_RSHIFT 
1e790 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e7a0 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
1e7b0 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65  oncat );      te
1e7c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43  stcase( op==TK_C
1e7d0 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72  ONCAT );.      r
1e7e0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1e7f0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e800 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1e810 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1e820 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1e830 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e840 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1e850 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1e860 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e870 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72  Op3(v, op, r2, r
1e880 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1e890 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1e8a0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1e8b0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1e8c0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1e8d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e8e0 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
1e8f0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1e900 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
1e910 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eft;.      asser
1e920 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  t( pLeft );.    
1e930 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
1e940 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
1e950 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
1e960 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  er(pParse, pLeft
1e970 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
1e980 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1e990 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  get;.#ifndef SQL
1e9a0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1e9b0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65  G_POINT.      }e
1e9c0 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
1e9d0 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
1e9e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1e9f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ea00 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1ea10 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ue) );.        c
1ea20 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74  odeReal(v, pLeft
1ea30 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74  ->u.zToken, 1, t
1ea40 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1ea50 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23  return target;.#
1ea60 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
1ea70 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  e{.        tempX
1ea80 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52  .op = TK_INTEGER
1ea90 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
1eaa0 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61  flags = EP_IntVa
1eab0 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  lue|EP_TokenOnly
1eac0 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
1ead0 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  u.iValue = 0;.  
1eae0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1eaf0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1eb00 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
1eb10 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1eb20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1eb30 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1eb40 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1eb50 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1eb60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1eb70 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
1eb80 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20  btract, r2, r1, 
1eb90 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1eba0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ebb0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1ebc0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1ebd0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ebe0 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
1ebf0 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1ec00 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1ec10 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
1ec20 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1ec30 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
1ec40 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ec50 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20  NOT==OP_Not );  
1ec60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ec70 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20   op==TK_NOT );. 
1ec80 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1ec90 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1eca0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1ecb0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1ecc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ecd0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1ece0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ecf0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
1ed00 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
1ed10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ed20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
1ed30 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72  {.      int isTr
1ed40 75 65 3b 20 20 20 20 2f 2a 20 49 53 20 54 52 55  ue;    /* IS TRU
1ed50 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45  E or IS NOT TRUE
1ed60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 4e   */.      int bN
1ed70 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54  ormal;   /* IS T
1ed80 52 55 45 20 6f 72 20 49 53 20 46 41 4c 53 45 20  RUE or IS FALSE 
1ed90 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  */.      r1 = sq
1eda0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1edb0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1edc0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1edd0 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
1ede0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1edf0 29 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20  );.      isTrue 
1ee00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  = sqlite3ExprTru
1ee10 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70  thValue(pExpr->p
1ee20 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 62 4e  Right);.      bN
1ee30 6f 72 6d 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f  ormal = pExpr->o
1ee40 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20  p2==TK_IS;.     
1ee50 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75   testcase( isTru
1ee60 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20  e && bNormal);. 
1ee70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
1ee80 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61  isTrue && bNorma
1ee90 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1eea0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1eeb0 2c 20 4f 50 5f 49 73 54 72 75 65 2c 20 72 31 2c  , OP_IsTrue, r1,
1eec0 20 69 6e 52 65 67 2c 20 21 69 73 54 72 75 65 2c   inReg, !isTrue,
1eed0 20 69 73 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61   isTrue ^ bNorma
1eee0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1eef0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ef00 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
1ef10 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1ef20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
1ef30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ef40 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
1ef50 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
1ef60 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1ef70 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
1ef80 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
1ef90 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
1efa0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1efb0 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
1efc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1efd0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1efe0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1eff0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1f000 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f010 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f020 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1f030 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f040 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f050 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
1f060 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
1f070 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1f080 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1f090 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
1f0a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1f0b0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
1f0c0 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  TNULL);.      sq
1f0d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f0e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1f0f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f100 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1f110 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
1f120 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f130 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
1f140 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
1f150 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
1f160 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
1f170 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
1f180 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
1f190 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1f1a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1f1b0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1f1c0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1f1d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1f1e0 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
1f1f0 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
1f200 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1f210 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1f220 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1f230 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
1f240 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
1f250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1f260 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f270 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
1f280 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
1f290 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
1f2a0 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
1f2b0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1f2c0 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b        int nFarg;
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f2e0 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69  Number of functi
1f2f0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1f300 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
1f310 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Def;         /* 
1f320 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  The function def
1f330 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  inition object *
1f340 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
1f350 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f  ar *zId;       /
1f360 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
1f370 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  ame */.      u32
1f380 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20   constMask = 0; 
1f390 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66      /* Mask of f
1f3a0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1f3b0 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74  s that are const
1f3c0 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ant */.      int
1f3d0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1f3e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1f3f0 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ter */.      sql
1f400 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1f410 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
1f420 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1f430 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  on */.      u8 e
1f440 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20  nc = ENC(db);   
1f450 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
1f460 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20  ncoding used by 
1f470 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
1f480 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
1f490 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a  pColl = 0;    /*
1f4a0 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   A collating seq
1f4b0 75 65 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65  uence */..#ifnde
1f4c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
1f4d0 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69  NDOWFUNC.      i
1f4e0 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
1f4f0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
1f500 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1f510 65 64 29 20 26 26 20 70 45 78 70 72 2d 3e 70 57  ed) && pExpr->pW
1f520 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  in ){.        re
1f530 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 57 69 6e  turn pExpr->pWin
1f540 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20  ->regResult;.   
1f550 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1f560 20 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74     if( ConstFact
1f570 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20  orOk(pParse) && 
1f580 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
1f590 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78  stantNotJoin(pEx
1f5a0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
1f5b0 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  * SQL functions 
1f5c0 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65  can be expensive
1f5d0 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65  . So try to move
1f5e0 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69   constant functi
1f5f0 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ons.        ** o
1f600 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  ut of the inner 
1f610 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68  loop, even if th
1f620 61 74 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72  at means an extr
1f630 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20  a OP_Copy. */.  
1f640 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1f650 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
1f660 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
1f670 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , -1);.      }. 
1f680 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1f690 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1f6a0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1f6b0 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
1f6c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1f6d0 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
1f6e0 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
1f6f0 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20  pFarg = 0;.     
1f700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f710 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78  pFarg = pExpr->x
1f720 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  .pList;.      }.
1f730 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46        nFarg = pF
1f740 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78  arg ? pFarg->nEx
1f750 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73  pr : 0;.      as
1f760 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1f770 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1f780 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1f790 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d      zId = pExpr-
1f7a0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1f7b0 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
1f7c0 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
1f7d0 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  zId, nFarg, enc,
1f7e0 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
1f7f0 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57  TE_ENABLE_UNKNOW
1f800 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20  N_SQL_FUNCTION. 
1f810 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
1f820 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c   && pParse->expl
1f830 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ain ){.        p
1f840 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
1f850 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75  dFunction(db, "u
1f860 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20  nknown", nFarg, 
1f870 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  enc, 0);.      }
1f880 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
1f890 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65  ( pDef==0 || pDe
1f8a0 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20  f->xFinalize!=0 
1f8b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f8c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1f8d0 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63  e, "unknown func
1f8e0 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64  tion: %s()", zId
1f8f0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1f900 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1f910 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69   /* Attempt a di
1f920 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rect implementat
1f930 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74  ion of the built
1f940 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61  -in COALESCE() a
1f950 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55  nd.      ** IFNU
1f960 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  LL() functions. 
1f970 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e   This avoids unn
1f980 65 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74  ecessary evaluat
1f990 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ion of.      ** 
1f9a0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74  arguments past t
1f9b0 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c  he first non-NUL
1f9c0 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  L argument..    
1f9d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1f9e0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
1f9f0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41   SQLITE_FUNC_COA
1fa00 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20  LESCE ){.       
1fa10 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65   int endCoalesce
1fa20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1fa30 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1fa40 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
1fa50 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  g>=2 );.        
1fa60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1fa70 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1fa80 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
1fa90 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  t);.        for(
1faa0 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=1; i<nFarg; i+
1fab0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
1fac0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1fad0 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74  v, OP_NotNull, t
1fae0 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73  arget, endCoales
1faf0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ce);.          V
1fb00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1fb10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1fb20 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1fb30 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
1fb40 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1fb50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fb60 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1fb70 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f  veLabel(v, endCo
1fb80 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
1fb90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1fba0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e  .      /* The UN
1fbb0 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f  LIKELY() functio
1fbc0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54  n is a no-op.  T
1fbd0 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65  he result is the
1fbe0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
1fbf0 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  of the first arg
1fc00 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ument..      */.
1fc10 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
1fc20 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1fc30 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59  TE_FUNC_UNLIKELY
1fc40 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1fc50 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a  rt( nFarg>=1 );.
1fc60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
1fc70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1fc80 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 46 61  rget(pParse, pFa
1fc90 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
1fca0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
1fcb0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1fcc0 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 54  DEBUG.      /* T
1fcd0 68 65 20 41 46 46 49 4e 49 54 59 28 29 20 66 75  he AFFINITY() fu
1fce0 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  nction evaluates
1fcf0 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61   to a string tha
1fd00 74 20 64 65 73 63 72 69 62 65 73 0a 20 20 20 20  t describes.    
1fd10 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20 61 66    ** the type af
1fd20 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 61 72  finity of the ar
1fd30 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73  gument.  This is
1fd40 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
1fd50 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  g of.      ** th
1fd60 65 20 53 51 4c 69 74 65 20 74 79 70 65 20 6c 6f  e SQLite type lo
1fd70 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  gic..      */.  
1fd80 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
1fd90 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
1fda0 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 20 29  _FUNC_AFFINITY )
1fdb0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1fdc0 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20  char *azAff[] = 
1fdd0 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74 22  { "blob", "text"
1fde0 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e  , "numeric", "in
1fdf0 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22 20 7d  teger", "real" }
1fe00 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61  ;.        char a
1fe10 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ff;.        asse
1fe20 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a  rt( nFarg==1 );.
1fe30 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71          aff = sq
1fe40 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1fe50 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  y(pFarg->a[0].pE
1fe60 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
1fe70 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
1fe80 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 0a  ing(v, target, .
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
1feb0 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53 51  f ? azAff[aff-SQ
1fec0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a  LITE_AFF_BLOB] :
1fed0 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20   "none");.      
1fee0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1fef0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1ff00 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1ff10 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
1ff20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20         if( i<32 
1ff30 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
1ff40 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e  Constant(pFarg->
1ff50 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
1ff60 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1ff70 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20  e( i==31 );.    
1ff80 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
1ff90 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b  |= MASKBIT32(i);
1ffa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ffb0 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
1ffc0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
1ffd0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21  _FUNC_NEEDCOLL)!
1ffe0 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  =0 && !pColl ){.
1fff0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
20000 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
20010 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61  lSeq(pParse, pFa
20020 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  rg->a[i].pExpr);
20030 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20040 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61   }.      if( pFa
20050 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rg ){.        if
20060 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20  ( constMask ){. 
20070 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 50           r1 = pP
20080 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
20090 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
200a0 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20  nMem += nFarg;. 
200b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
200c0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
200d0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
200e0 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b  (pParse, nFarg);
200f0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
20100 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74      /* For lengt
20110 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29  h() and typeof()
20120 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20   functions with 
20130 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e  a column argumen
20140 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  t,.        ** se
20150 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74  t the P5 paramet
20160 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c  er to the OP_Col
20170 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50  umn opcode to OP
20180 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20  FLAG_LENGTHARG. 
20190 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46         ** or OPF
201a0 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65  LAG_TYPEOFARG re
201b0 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61  spectively, to a
201c0 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
201d0 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a   data.        **
201e0 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   loading..      
201f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
20200 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
20210 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  s & (SQLITE_FUNC
20220 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46  _LENGTH|SQLITE_F
20230 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20  UNC_TYPEOF))!=0 
20240 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
20250 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20  exprOp;.        
20260 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d    assert( nFarg=
20270 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =1 );.          
20280 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61  assert( pFarg->a
20290 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a  [0].pExpr!=0 );.
202a0 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70            exprOp
202b0 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70   = pFarg->a[0].p
202c0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  Expr->op;.      
202d0 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d      if( exprOp==
202e0 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70  TK_COLUMN || exp
202f0 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  rOp==TK_AGG_COLU
20300 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
20310 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
20320 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50  _FUNC_LENGTH==OP
20330 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
20340 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
20350 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
20360 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47  C_TYPEOF==OPFLAG
20370 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20  _TYPEOFARG );.  
20380 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
20390 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  se( pDef->funcFl
203a0 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e  ags & OPFLAG_LEN
203b0 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
203c0 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30        pFarg->a[0
203d0 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a  ].pExpr->op2 = .
203e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203f0 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67    pDef->funcFlag
20400 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47  s & (OPFLAG_LENG
20410 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50  THARG|OPFLAG_TYP
20420 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20  EOFARG);.       
20430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
20440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20450 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
20460 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72  pParse, pFarg, r
20470 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
20480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20490 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
204a0 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45  L_DUP|SQLITE_ECE
204b0 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20  L_FACTOR);.     
204c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
204d0 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  r1 = 0;.      }.
204e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
204f0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
20500 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62  .      /* Possib
20510 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20  ly overload the 
20520 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20  function if the 
20530 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
20540 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72  s.      ** a vir
20550 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d  tual table colum
20560 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
20570 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66    ** For infix f
20580 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20  unctions (LIKE, 
20590 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e  GLOB, REGEXP, an
205a0 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65  d MATCH) use the
205b0 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64  .      ** second
205c0 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74   argument, not t
205d0 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65  he first, as the
205e0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73   argument to tes
205f0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  t to.      ** se
20600 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c  e if it is a col
20610 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c  umn in a virtual
20620 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
20630 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20   done because.  
20640 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20      ** the left 
20650 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78  operand of infix
20660 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20   functions (the 
20670 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20  operand we want 
20680 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  to.      ** cont
20690 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29  rol overloading)
206a0 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20   ends up as the 
206b0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
206c0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
206d0 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65  function.  The e
206e0 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f  xpression "A glo
206f0 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65  b B" is equivale
20700 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  nt to .      ** 
20710 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20  "glob(B,A).  We 
20720 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20  want to use the 
20730 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  A in "A glob B" 
20740 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a  to test.      **
20750 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76   for function ov
20760 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20  erloading.  But 
20770 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72  we use the B ter
20780 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22  m in "glob(B,A)"
20790 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
207a0 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26   if( nFarg>=2 &&
207b0 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
207c0 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29   EP_InfixFunc) )
207d0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
207e0 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
207f0 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
20800 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
20810 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  arg->a[1].pExpr)
20820 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
20830 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20  ( nFarg>0 ){.   
20840 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
20850 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
20860 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
20870 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
20880 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
20890 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
208a0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
208b0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
208c0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
208d0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
208e0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
208f0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
20900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20910 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
20920 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
20930 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
20940 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
20950 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
20960 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53  _ENABLE_OFFSET_S
20970 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20 69 66  QL_FUNC.      if
20980 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
20990 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
209a0 4f 46 46 53 45 54 20 29 7b 0a 20 20 20 20 20 20  OFFSET ){.      
209b0 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20 70    Expr *pArg = p
209c0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
209d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
209e0 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  rg->op==TK_COLUM
209f0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  N ){.          s
20a00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
20a10 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c 20 70  (v, OP_Offset, p
20a20 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70 41 72  Arg->iTable, pAr
20a30 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  g->iColumn, targ
20a40 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  et);.        }el
20a50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
20a60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20a70 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
20a80 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
20a90 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  }.      }else.#e
20aa0 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
20ab0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20ac0 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72 73 65  AddOp4(v, pParse
20ad0 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f  ->iSelfTab ? OP_
20ae0 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46  PureFunc0 : OP_F
20af0 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20  unction0,.      
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b10 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72      constMask, r
20b20 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68 61 72  1, target, (char
20b30 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44  *)pDef, P4_FUNCD
20b40 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  EF);.        sql
20b50 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
20b60 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a  (v, (u8)nFarg);.
20b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20b80 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74  ( nFarg && const
20b90 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Mask==0 ){.     
20ba0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
20bb0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
20bc0 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20  e, r1, nFarg);. 
20bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
20be0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
20bf0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
20c00 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
20c10 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
20c20 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
20c30 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  ELECT: {.      i
20c40 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74  nt nCol;.      t
20c50 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
20c60 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
20c70 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
20c80 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
20c90 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45   if( op==TK_SELE
20ca0 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45  CT && (nCol = pE
20cb0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
20cc0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d  pEList->nExpr)!=
20cd0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
20ce0 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
20cf0 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c  or(pParse, nCol,
20d00 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
20d10 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
20d20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
20d30 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
20d40 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  xpr, 0, 0);.    
20d50 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
20d60 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20d70 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
20d80 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
20d90 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
20da0 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d  ->pLeft->iTable=
20db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
20dc0 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
20dd0 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  le = sqlite3Code
20de0 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
20df0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20e00 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
20e10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
20e20 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c  pr->iTable==0 ||
20e30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f   pExpr->pLeft->o
20e40 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
20e50 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
20e60 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 26  >iTable.       &
20e70 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  & pExpr->iTable!
20e80 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  =(n = sqlite3Exp
20e90 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
20ea0 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20 20  r->pLeft)) .    
20eb0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
20ec0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
20ed0 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73  rse, "%d columns
20ee0 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c   assigned %d val
20ef0 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ues",.          
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f10 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
20f20 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ble, n);.      }
20f30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45  .      return pE
20f40 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
20f50 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c  le + pExpr->iCol
20f60 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  umn;.    }.    c
20f70 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
20f80 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
20f90 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
20fa0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20fb0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
20fc0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
20fd0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20fe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20ff0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
21000 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
21010 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21020 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
21030 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
21040 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
21050 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21060 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
21070 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
21080 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21090 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
210a0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
210b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
210c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
210d0 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30  ddImm, target, 0
210e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
210f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
21100 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
21110 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
21120 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
21130 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
21140 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
21150 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
21160 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
21170 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
21180 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
21190 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
211a0 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
211b0 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
211c0 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
211d0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
211e0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
211f0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
21200 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
21210 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
21220 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
21230 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
21240 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
21250 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
21260 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
21270 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
21280 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30  pr, target, 0, 0
21290 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
212a0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
212b0 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a    case TK_SPAN:.
212c0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
212d0 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
212e0 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
212f0 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e   pExpr = pExpr->
21300 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67 6f 74  pLeft;.      got
21310 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76  o expr_code_doov
21320 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34 2d 32  er; /* 2018-04-2
21330 38 3a 20 50 72 65 76 65 6e 74 20 64 65 65 70 20  8: Prevent deep 
21340 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53 46 75  recursion. OSSFu
21350 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  zz. */.    }..  
21360 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
21370 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
21380 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
21390 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
213a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
213b0 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
213c0 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
213d0 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
213e0 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
213f0 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
21400 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
21410 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
21420 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
21430 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
21440 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
21450 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
21460 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
21470 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
21480 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
21490 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
214a0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
214b0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
214c0 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
214d0 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
214e0 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
214f0 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
21500 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
21510 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
21520 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
21530 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
21540 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
21550 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
21560 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
21570 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
21580 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
21590 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
215a0 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
215b0 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
215c0 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
215d0 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
215e0 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
215f0 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
21600 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
21610 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
21620 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
21630 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
21640 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
21650 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
21660 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
21670 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
21680 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
21690 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
216a0 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
216b0 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
216c0 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
216d0 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
216e0 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
216f0 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
21700 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
21710 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
21720 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
21730 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
21740 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
21750 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
21760 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21770 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
21780 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
21790 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
217a0 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
217b0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
217c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
217d0 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
217e0 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
217f0 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
21800 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
21810 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
21820 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
21830 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
21840 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
21850 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
21860 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
21870 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
21880 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
21890 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
218a0 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
218b0 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45       int p1 = pE
218c0 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70  xpr->iTable * (p
218d0 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31  Tab->nCol+1) + 1
218e0 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   + pExpr->iColum
218f0 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  n;..      assert
21900 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
21910 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  =0 || pExpr->iTa
21920 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
21930 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
21940 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45  Column>=-1 && pE
21950 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61  xpr->iColumn<pTa
21960 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
21970 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69   assert( pTab->i
21980 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d  PKey<0 || pExpr-
21990 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e  >iColumn!=pTab->
219a0 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61  iPKey );.      a
219b0 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
219c0 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32  p1<(pTab->nCol*2
219d0 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71  +2) );..      sq
219e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
219f0 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c  v, OP_Param, p1,
21a00 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21a10 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
21a20 22 72 5b 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74  "r[%d]=%s.%s", t
21a30 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 28  arget,.        (
21a40 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
21a50 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a  "new" : "old"),.
21a60 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
21a70 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77  iColumn<0 ? "row
21a80 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61  id" : pExpr->pTa
21a90 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
21aa0 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a 20  Column].zName). 
21ab0 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65       ));..#ifnde
21ac0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
21ad0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
21ae0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
21af0 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66  umn has REAL aff
21b00 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75  inity, it may cu
21b10 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
21b20 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a  d as an.      **
21b30 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50   integer. Use OP
21b40 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f  _RealAffinity to
21b50 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
21b60 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20   really real..  
21b70 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21b80 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
21b90 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74  0985-57662 SQLit
21ba0 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  e will convert t
21bb0 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f  he value back to
21bc0 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  .      ** floati
21bd0 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78  ng point when ex
21be0 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d  tracting it from
21bf0 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f   the record.  */
21c00 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
21c10 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20  ->iColumn>=0 .  
21c20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43       && pTab->aC
21c30 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
21c40 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  n].affinity==SQL
21c50 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20  ITE_AFF_REAL.   
21c60 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
21c70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
21c80 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  v, OP_RealAffini
21c90 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ty, target);.   
21ca0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
21cb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
21cc0 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54      case TK_VECT
21cd0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OR: {.      sqli
21ce0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
21cf0 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
21d00 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20  isused");.      
21d10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
21d20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c    case TK_IF_NUL
21d30 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69  L_ROW: {.      i
21d40 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20  nt addrINR;.    
21d50 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69    addrINR = sqli
21d60 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
21d70 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70   OP_IfNullRow, p
21d80 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
21d90 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
21da0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
21db0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
21dc0 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
21dd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21de0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
21df0 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73  ddrINR);.      s
21e00 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
21e10 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69  P3(v, addrINR, i
21e20 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
21e30 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
21e40 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
21e50 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
21e60 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
21e70 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
21e80 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
21e90 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
21ea0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
21eb0 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
21ec0 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
21ed0 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
21ee0 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
21ef0 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
21f00 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
21f10 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
21f20 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
21f30 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
21f40 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
21f50 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
21f60 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
21f70 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
21f80 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
21f90 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
21fa0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
21fb0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
21fc0 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
21fd0 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
21fe0 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
21ff0 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74  Y is in the last
22000 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70   element of pExp
22010 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45  r->x.pList if pE
22020 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
22030 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64  xpr is.    ** od
22040 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73  d.  The Y is als
22050 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  o optional.  If 
22060 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
22070 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73  ements in x.pLis
22080 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e  t.    ** is even
22090 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74  , then Y is omit
220a0 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68  ted and the "oth
220b0 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69  erwise" result i
220c0 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
220d0 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
220e0 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
220f0 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
22100 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
22110 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
22120 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
22130 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
22140 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
22150 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
22160 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
22170 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
22180 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
22190 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
221a0 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
221b0 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
221c0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
221d0 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
221e0 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
221f0 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
22220 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
22230 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
22240 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22260 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
22270 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
22280 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
22290 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
222c0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
222d0 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
22300 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
22310 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
22320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22330 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
22340 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
22350 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
22360 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
22370 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
22380 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
22390 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
223a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
223b0 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
223c0 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
223d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
22400 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
22410 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74       Expr *pTest
22420 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22430 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20         /* X==Ei 
22440 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74  (form A) or just
22450 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a   Ei (form B) */.
22460 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
22470 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20  int iCacheLevel 
22480 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
22490 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20  Level; )..      
224a0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
224b0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
224c0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26  EP_xIsSelect) &&
224d0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
224e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
224f0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
22500 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20  nExpr > 0);.    
22510 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
22520 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
22530 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c   aListelem = pEL
22540 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45  ist->a;.      nE
22550 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
22560 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61  xpr;.      endLa
22570 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bel = sqlite3Vdb
22580 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22590 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70       if( (pX = p
225a0 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
225b0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  ){.        tempX
225c0 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20   = *pX;.        
225d0 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
225e0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
225f0 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67         exprToReg
22600 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78  ister(&tempX, ex
22610 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
22620 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
22630 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
22640 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
22650 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
22660 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d     memset(&opCom
22670 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pare, 0, sizeof(
22680 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20  opCompare));.   
22690 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
226a0 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
226b0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
226c0 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20  ft = &tempX;.   
226d0 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
226e0 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
226f0 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
22700 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
22710 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
22720 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
22730 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
22740 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
22750 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
22760 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
22770 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
22780 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
22790 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
227a0 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
227b0 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
227c0 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
227d0 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
227e0 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
227f0 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
22800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22810 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
22820 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  -1; i=i+2){.    
22830 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
22840 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22850 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
22860 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
22870 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
22880 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
22890 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
228a0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
228b0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
228c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
228d0 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
228e0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
228f0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
22900 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d  testcase( pTest-
22910 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
22920 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22930 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
22940 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74  rse, pTest, next
22950 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Case, SQLITE_JUM
22960 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
22970 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73    testcase( aLis
22980 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
22990 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
229a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
229b0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
229c0 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
229d0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
229e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
229f0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64  3VdbeGoto(v, end
22a00 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Label);.        
22a10 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
22a20 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43  veLabel(v, nextC
22a30 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ase);.      }.  
22a40 20 20 20 20 69 66 28 20 28 6e 45 78 70 72 26 31      if( (nExpr&1
22a50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
22a60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
22a70 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
22a80 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72  a[nExpr-1].pExpr
22a90 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
22aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22ab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22ac0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
22ad0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
22ae0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
22af0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
22b00 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
22b10 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20  se->nErr>0 .    
22b20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
22b30 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69  ->iCacheLevel==i
22b40 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20  CacheLevel );.  
22b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
22b60 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
22b70 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
22b80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
22b90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22ba0 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
22bb0 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
22bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
22bd0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
22be0 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20  Rollback .      
22bf0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
22c00 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
22c10 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  t.           || 
22c20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
22c30 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20  =OE_Fail.       
22c40 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
22c50 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
22c60 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
22c70 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54   if( !pParse->pT
22c80 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20  riggerTab ){.   
22c90 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
22ca0 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cc0 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
22cd0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
22ce0 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
22cf0 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
22d00 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
22d10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
22d20 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
22d30 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
22d40 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
22d50 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
22d60 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
22d70 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
22d80 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
22d90 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
22da0 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
22db0 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  ity==OE_Ignore )
22dc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22dd0 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
22de0 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48           v, OP_H
22df0 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  alt, SQLITE_OK, 
22e00 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45  OE_Ignore, 0, pE
22e10 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29  xpr->u.zToken,0)
22e20 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
22e30 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
22e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22e50 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
22e60 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51  raint(pParse, SQ
22e70 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
22e80 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20  TRIGGER,.       
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
22eb0 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75  finity, pExpr->u
22ec0 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a  .zToken, 0, 0);.
22ed0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
22ee0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
22ef0 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
22f00 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
22f10 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
22f20 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
22f30 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
22f40 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
22f50 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
22f60 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74  /*.** Factor out
22f70 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65   the code of the
22f80 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
22f90 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  n to initializat
22fa0 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ion time..**.** 
22fb0 49 66 20 72 65 67 44 65 73 74 3e 3d 30 20 74 68  If regDest>=0 th
22fc0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
22fd0 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20 69   always stored i
22fe0 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
22ff0 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  and the.** resul
23000 74 20 69 73 20 6e 6f 74 20 72 65 75 73 61 62 6c  t is not reusabl
23010 65 2e 20 20 49 66 20 72 65 67 44 65 73 74 3c 30  e.  If regDest<0
23020 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
23030 6e 65 20 69 73 20 66 72 65 65 20 74 6f 20 0a 2a  ne is free to .*
23040 2a 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  * store the valu
23050 65 20 77 68 65 72 65 65 76 65 72 20 69 74 20 77  e whereever it w
23060 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73  ants.  The regis
23070 74 65 72 20 77 68 65 72 65 20 74 68 65 20 65 78  ter where the ex
23080 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69 73 20  pression .** is 
23090 73 74 6f 72 65 64 20 69 73 20 72 65 74 75 72 6e  stored is return
230a0 65 64 2e 20 20 57 68 65 6e 20 72 65 67 44 65 73  ed.  When regDes
230b0 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74 69 63  t<0, two identic
230c0 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 77  al expressions w
230d0 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 74  ill.** code to t
230e0 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65 72  he same register
230f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23100 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a  ExprCodeAtInit(.
23110 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
23120 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
23130 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
23140 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
23150 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
23160 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65  to code when the
23170 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65   VDBE initialize
23180 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65  s */.  int regDe
23190 73 74 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  st       /* Stor
231a0 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  e the value in t
231b0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
231c0 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
231d0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73  ;.  assert( Cons
231e0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
231f0 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  ) );.  p = pPars
23200 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20  e->pConstExpr;. 
23210 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20 26   if( regDest<0 &
23220 26 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63  & p ){.    struc
23230 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
23240 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20  *pItem;.    int 
23250 69 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d  i;.    for(pItem
23260 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70  =p->a, i=p->nExp
23270 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c  r; i>0; pItem++,
23280 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   i--){.      if(
23290 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
232a0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
232b0 6f 6d 70 61 72 65 28 30 2c 70 49 74 65 6d 2d 3e  ompare(0,pItem->
232c0 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d  pExpr,pExpr,-1)=
232d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
232e0 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43  turn pItem->u.iC
232f0 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20  onstExprReg;.   
23300 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
23310 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
23320 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
23330 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
23340 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
23350 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
23360 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20  e, p, pExpr);.  
23370 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74  if( p ){.     st
23380 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
23390 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
233a0 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  a[p->nExpr-1];. 
233b0 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61      pItem->reusa
233c0 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c 30 3b  ble = regDest<0;
233d0 0a 20 20 20 20 20 69 66 28 20 72 65 67 44 65 73  .     if( regDes
233e0 74 3c 30 20 29 20 72 65 67 44 65 73 74 20 3d 20  t<0 ) regDest = 
233f0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
23400 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43       pItem->u.iC
23410 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65  onstExprReg = re
23420 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70 50 61  gDest;.  }.  pPa
23430 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20  rse->pConstExpr 
23440 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  = p;.  return re
23450 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  gDest;.}../*.** 
23460 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
23470 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   evaluate an exp
23480 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ression and stor
23490 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
234a0 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
234b0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
234c0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
234d0 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ere the results.
234e0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ** are stored..*
234f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69  *.** If the regi
23500 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
23510 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61  ary register tha
23520 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63  t can be dealloc
23530 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72  ated,.** then wr
23540 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69  ite its number i
23550 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74  nto *pReg.  If t
23560 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  he result regist
23570 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74  er is not.** a t
23580 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73  emporary, then s
23590 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f  et *pReg to zero
235a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
235b0 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20   is a constant, 
235c0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
235d0 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65  e might generate
235e0 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f   this.** code to
235f0 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74   fill the regist
23600 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61  er in the initia
23610 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e  lization section
23620 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20   of the.** VDBE 
23630 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65  program, in orde
23640 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f  r to factor it o
23650 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61  ut of the evalua
23660 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e  tion loop..*/.in
23670 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
23680 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61  eTemp(Parse *pPa
23690 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
236a0 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20  , int *pReg){.  
236b0 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20  int r2;.  pExpr 
236c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
236d0 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b  pCollate(pExpr);
236e0 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74  .  if( ConstFact
236f0 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20  orOk(pParse).   
23700 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
23710 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20  _REGISTER.   && 
23720 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
23730 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78  stantNotJoin(pEx
23740 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 52  pr).  ){.    *pR
23750 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72 32 20  eg  = 0;.    r2 
23760 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
23770 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
23780 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 7d 65  pExpr, -1);.  }e
23790 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20  lse{.    int r1 
237a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
237b0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
237c0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
237d0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
237e0 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
237f0 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29      if( r2==r1 )
23800 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20  {.      *pReg = 
23810 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r1;.    }else{. 
23820 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
23830 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
23840 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70  e, r1);.      *p
23850 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
23860 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a   }.  return r2;.
23870 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
23880 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
23890 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
238a0 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
238b0 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
238c0 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
238d0 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
238e0 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
238f0 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
23900 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
23910 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  get..*/.void sql
23920 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72  ite3ExprCode(Par
23930 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
23940 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
23950 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65  get){.  int inRe
23960 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  g;..  assert( ta
23970 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
23980 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
23990 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26  ;.  if( pExpr &&
239a0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52   pExpr->op==TK_R
239b0 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73  EGISTER ){.    s
239c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
239d0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
239e0 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e  OP_Copy, pExpr->
239f0 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b  iTable, target);
23a00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
23a10 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
23a20 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
23a30 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
23a40 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
23a50 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
23a60 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
23a70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
23a80 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
23a90 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d  arget && pParse-
23aa0 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20  >pVdbe ){.      
23ab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23ac0 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
23ad0 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
23ae0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d  , target);.    }
23af0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
23b00 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63  ke a transient c
23b10 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f  opy of expressio
23b20 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68 65 6e  n pExpr and then
23b30 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67 0a 2a   code it using.*
23b40 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  * sqlite3ExprCod
23b50 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  e().  This routi
23b60 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  ne works just li
23b70 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ke sqlite3ExprCo
23b80 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74 20 74  de().** except t
23b90 68 61 74 20 74 68 65 20 69 6e 70 75 74 20 65 78  hat the input ex
23ba0 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75 61 72  pression is guar
23bb0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63  anteed to be unc
23bc0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  hanged..*/.void 
23bd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
23be0 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  opy(Parse *pPars
23bf0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
23c00 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 73  int target){.  s
23c10 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
23c20 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72  rse->db;.  pExpr
23c30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
23c40 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
23c50 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
23c60 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c 69 74  ocFailed ) sqlit
23c70 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
23c80 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
23c90 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
23ca0 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
23cb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
23cc0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
23cd0 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
23ce0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
23cf0 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
23d00 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
23d10 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
23d20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
23d30 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
23d40 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
23d50 74 61 72 67 65 74 2e 20 20 49 66 20 74 68 65 20  target.  If the 
23d60 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
23d70 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69  nstant, then thi
23d80 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
23d90 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64  ht choose to cod
23da0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
23db0 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   at initializati
23dc0 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  on time..*/.void
23dd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23de0 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65  Factorable(Parse
23df0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
23e00 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
23e10 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  t){.  if( pParse
23e20 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
23e30 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
23e40 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20  Constant(pExpr) 
23e50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
23e60 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
23e70 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
23e80 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et);.  }else{.  
23e90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
23ea0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
23eb0 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a   target);.  }.}.
23ec0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
23ed0 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
23ee0 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
23ef0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
23f00 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
23f10 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
23f20 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
23f30 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
23f40 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
23f50 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
23f60 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
23f70 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
23f80 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
23f90 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
23fa0 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
23fb0 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
23fc0 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
23fd0 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
23fe0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
23ff0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
24000 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
24010 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
24020 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
24030 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
24040 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
24050 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
24060 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
24070 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
24080 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24090 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
240a0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
240b0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
240c0 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
240d0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
240e0 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20  .  int iMem;..  
240f0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
24100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
24110 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
24120 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  STER );.  sqlite
24130 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
24140 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
24150 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ;.  iMem = ++pPa
24160 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
24170 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24180 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65  , OP_Copy, targe
24190 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72  t, iMem);.  expr
241a0 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72  ToRegister(pExpr
241b0 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iMem);.}../*.*
241c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
241d0 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
241e0 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
241f0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
24200 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
24210 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
24220 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
24230 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
24240 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
24250 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
24260 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
24270 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6d  luated.  The num
24280 62 65 72 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ber returned wil
24290 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65 20  l.** usually be 
242a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62 75 74  pList->nExpr but
242b0 20 6d 69 67 68 74 20 62 65 20 72 65 64 75 63 65   might be reduce
242c0 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c  d if SQLITE_ECEL
242d0 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20 64  _OMITREF.** is d
242e0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  efined..**.** Th
242f0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  e SQLITE_ECEL_DU
24300 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  P flag prevents 
24310 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72  the arguments fr
24320 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c  om being.** fill
24330 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70  ed using OP_SCop
24340 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74  y.  OP_Copy must
24350 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
24360 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
24370 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61  TE_ECEL_FACTOR a
24380 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63  rgument allows c
24390 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
243a0 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f  s to be.** facto
243b0 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69  red out into ini
243c0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65  tialization code
243d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
243e0 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67  TE_ECEL_REF flag
243f0 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72   means that expr
24400 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c  essions in the l
24410 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72  ist with.** Expr
24420 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72  List.a[].u.x.iOr
24430 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20  derByCol>0 have 
24440 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61  already been eva
24450 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65  luated and store
24460 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  d.** in register
24470 73 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64  s at srcReg, and
24480 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61   so the value ca
24490 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d  n be copied from
244a0 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51   there..** If SQ
244b0 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
244c0 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c 20 74  F is also set, t
244d0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 77  hen the values w
244e0 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72 42 79  ith u.x.iOrderBy
244f0 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d  Col>0.** are sim
24500 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61 74 68  ply omitted rath
24510 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20 63 6f  er than being co
24520 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52 65 67  pied from srcReg
24530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24540 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
24550 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
24560 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
24570 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
24580 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
24590 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
245a0 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
245b0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
245c0 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
245d0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
245e0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
245f0 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f  srcReg,        /
24600 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74 65  * Source registe
24610 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45  rs if SQLITE_ECE
24620 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c  L_REF */.  u8 fl
24630 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
24640 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66   SQLITE_ECEL_* f
24650 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lags */.){.  str
24660 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
24670 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
24680 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f  i, j, n;.  u8 co
24690 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20  pyOp = (flags & 
246a0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
246b0 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
246c0 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76  SCopy;.  Vdbe *v
246d0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
246e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
246f0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
24700 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
24710 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
24720 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
24730 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
24740 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
24750 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
24760 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73  xpr;.  if( !Cons
24770 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
24780 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51  ) ) flags &= ~SQ
24790 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
247a0 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
247b0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
247c0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
247d0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
247e0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
247f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
24800 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
24810 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
24820 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
24830 66 20 29 7b 0a 20 20 20 20 20 20 69 2d 2d 3b 0a  f ){.      i--;.
24840 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d        n--;.    }
24850 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
24860 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
24870 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30  ITE_ECEL_REF)!=0
24880 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e   && (j = pItem->
24890 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
248a0 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
248b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
248c0 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20  CEL_OMITREF ){. 
248d0 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20         i--;.    
248e0 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
248f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
24900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24910 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63  v, copyOp, j+src
24920 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29  Reg-1, target+i)
24930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
24940 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
24950 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
24960 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74  TOR)!=0 && sqlit
24970 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
24980 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
24990 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
249a0 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
249b0 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
249c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
249d0 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71    int inReg = sq
249e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
249f0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
24a00 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
24a10 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
24a20 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20  arget+i ){.     
24a30 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
24a40 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79          if( copy
24a50 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  Op==OP_Copy.    
24a60 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c       && (pOp=sql
24a70 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
24a80 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f   -1))->opcode==O
24a90 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
24aa0 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  && pOp->p1+pOp->
24ab0 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20  p3+1==inReg.    
24ac0 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b       && pOp->p2+
24ad0 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65  pOp->p3+1==targe
24ae0 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  t+i.        ){. 
24af0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33           pOp->p3
24b00 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
24b10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
24b20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24b30 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c  , copyOp, inReg,
24b40 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
24b50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24b60 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24b70 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
24b80 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
24b90 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
24ba0 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45  r..**.**    x BE
24bb0 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a  TWEEN y AND z.**
24bc0 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
24bd0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
24be0 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e  **.**    x>=y AN
24bf0 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64  D x<=z.**.** Cod
24c00 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
24c10 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
24c20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
24c30 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d  pression.** elim
24c40 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a  ination of x..**
24c50 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20  .** The xJumpIf 
24c60 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
24c70 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a  ines details:.**
24c80 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20  .**    NULL:    
24c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
24ca0 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e  tore the boolean
24cb0 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64   result in reg[d
24cc0 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74  est].**    sqlit
24cd0 65 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20  e3ExprIfTrue:   
24ce0 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20     Jump to dest 
24cf0 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71  if true.**    sq
24d00 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24d10 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65  :     Jump to de
24d20 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a  st if false.**.*
24d30 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  * The jumpIfNull
24d40 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67   parameter is ig
24d50 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66  nored if xJumpIf
24d60 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61   is NULL..*/.sta
24d70 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64  tic void exprCod
24d80 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73  eBetween(.  Pars
24d90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
24da0 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
24db0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
24dc0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
24dd0 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
24de0 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65  he BETWEEN expre
24df0 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
24e00 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
24e10 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  Jump destination
24e20 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61   or storage loca
24e30 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28  tion */.  void (
24e40 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45  *xJump)(Parse*,E
24e50 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f  xpr*,int,int), /
24e60 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65  * Action to take
24e70 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
24e80 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20  Null    /* Take 
24e90 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
24ea0 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20  BETWEEN is NULL 
24eb0 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72  */.){. Expr expr
24ec0 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  And;     /* The 
24ed0 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20  AND operator in 
24ee0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20   x>=y AND x<=z  
24ef0 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65  */.  Expr compLe
24f00 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78  ft;    /* The  x
24f10 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  >=y  term */.  E
24f20 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20  xpr compRight;  
24f30 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74   /* The  x<=z  t
24f40 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78  erm */.  Expr ex
24f50 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  prX;       /* Th
24f60 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73  e  x  subexpress
24f70 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ion */.  int reg
24f80 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65  Free1 = 0; /* Te
24f90 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
24fa0 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73  ster */...  mems
24fb0 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c  et(&compLeft, 0,
24fc0 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
24fd0 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69    memset(&compRi
24fe0 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  ght, 0, sizeof(E
24ff0 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  xpr));.  memset(
25000 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a  &exprAnd, 0, siz
25010 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61  eof(Expr));..  a
25020 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
25030 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
25040 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
25050 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
25060 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ->pLeft;.  exprA
25070 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
25080 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
25090 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65  = &compLeft;.  e
250a0 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
250b0 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f  &compRight;.  co
250c0 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
250d0 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c  E;.  compLeft.pL
250e0 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
250f0 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
25100 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
25110 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
25120 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
25130 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68  K_LE;.  compRigh
25140 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
25150 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52  ;.  compRight.pR
25160 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
25170 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
25180 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  r;.  exprToRegis
25190 74 65 72 28 26 65 78 70 72 58 2c 20 65 78 70 72  ter(&exprX, expr
251a0 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
251b0 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
251c0 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a  ree1));.  if( xJ
251d0 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70  ump ){.    xJump
251e0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
251f0 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
25200 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ull);.  }else{. 
25210 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65     /* Mark the e
25220 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62 65 69  xpression is bei
25230 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f  ng from the ON o
25240 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
25250 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20  f a join.    ** 
25260 73 6f 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  so that the sqli
25270 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
25280 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  t() routine will
25290 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
252a0 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  move.    ** it i
252b0 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 43  nto the Parse.pC
252c0 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e 20 20  onstExpr list.  
252d0 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20 61 20  We should use a 
252e0 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68 69 73  new bit for this
252f0 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61  ,.    ** for cla
25300 72 69 74 79 2c 20 62 75 74 20 77 65 20 61 72 65  rity, but we are
25310 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e 20   out of bits in 
25320 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20 66  the Expr.flags f
25330 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20 2a  ield so we.    *
25340 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73 65 20  * have to reuse 
25350 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
25360 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f  bit.  Bummer. */
25370 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61 67 73  .    exprX.flags
25380 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b   |= EP_FromJoin;
25390 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
253a0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
253b0 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
253c0 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
253d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
253e0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
253f0 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  );..  /* Ensure 
25400 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f  adequate test co
25410 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74  verage */.  test
25420 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
25430 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
25440 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
25450 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
25460 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
25470 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
25480 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
25490 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
254a0 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
254b0 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
254c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
254d0 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21    && jumpIfNull!
254e0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
254f0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
25500 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
25510 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
25520 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
25530 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
25540 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
25550 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
25560 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
25570 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
25580 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
25590 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
255a0 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
255b0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
255c0 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
255d0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
255e0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
255f0 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
25600 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
25610 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
25620 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
25630 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
25640 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
25650 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
25660 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
25670 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ump==0 );.}../*.
25680 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
25690 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
256a0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
256b0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
256c0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
256d0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
256e0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
256f0 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
25700 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
25710 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
25720 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
25730 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
25740 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
25750 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
25760 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
25770 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
25780 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
25790 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
257a0 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
257b0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
257c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
257d0 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
257e0 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
257f0 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
25800 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
25810 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
25820 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
25830 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
25840 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
25850 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
25860 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
25870 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
25880 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
25890 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
258a0 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
258b0 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
258c0 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
258d0 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
258e0 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
258f0 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
25900 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
25910 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
25920 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25930 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
25940 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
25950 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
25960 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
25970 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
25980 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
25990 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
259a0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
259b0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
259c0 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
259d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
259e0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
259f0 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
25a00 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
25a10 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
25a20 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20   )     return;  
25a30 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
25a40 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
25a50 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
25a60 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
25a70 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f  ) return;  /* No
25a80 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
25a90 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  ppen */.  op = p
25aa0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
25ab0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
25ac0 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
25ad0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
25ae0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
25af0 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
25b00 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
25b10 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
25b20 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
25b30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
25b40 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
25b50 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
25b60 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
25b70 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
25b80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
25b90 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
25ba0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
25bb0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
25bc0 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
25bd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25be0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
25bf0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
25c00 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
25c10 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
25c20 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
25c30 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
25c40 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
25c50 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
25c60 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
25c70 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
25c80 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
25c90 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
25ca0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
25cb0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
25cc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
25cd0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
25ce0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25cf0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
25d00 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
25d10 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
25d20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25d30 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
25d40 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69  TRUTH: {.      i
25d50 6e 74 20 69 73 4e 6f 74 3b 20 20 20 20 20 20 2f  nt isNot;      /
25d60 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72  * IS NOT TRUE or
25d70 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
25d80 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75  .      int isTru
25d90 65 3b 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55  e;     /* IS TRU
25da0 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45  E or IS NOT TRUE
25db0 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
25dc0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
25dd0 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74  0 );.      isNot
25de0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54   = pExpr->op2==T
25df0 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69  K_ISNOT;.      i
25e00 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45  sTrue = sqlite3E
25e10 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45  xprTruthValue(pE
25e20 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
25e30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
25e40 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b  True && isNot );
25e50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25e60 20 21 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f   !isTrue && isNo
25e70 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  t );.      if( i
25e80 73 54 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b  sTrue ^ isNot ){
25e90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25ea0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
25eb0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
25ec0 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20   dest,.         
25ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ee0 20 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f   isNot ? SQLITE_
25ef0 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b  JUMPIFNULL : 0);
25f00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25f20 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
25f30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
25f40 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f60 69 73 4e 6f 74 20 3f 20 53 51 4c 49 54 45 5f 4a  isNot ? SQLITE_J
25f70 55 4d 50 49 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a  UMPIFNULL : 0);.
25f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
25f90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
25fa0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
25fb0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
25fc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
25fd0 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
25fe0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
25ff0 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
26000 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
26010 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
26020 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  E;.      jumpIfN
26030 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
26040 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
26050 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
26060 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
26070 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
26080 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
26090 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
260a0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
260b0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
260c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
260d0 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
260e0 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
260f0 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
26100 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26110 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26120 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
26130 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
26140 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26150 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
26160 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
26170 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
26180 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
26190 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
261a0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
261b0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
261c0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
261d0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
261f0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
26200 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
26210 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
26220 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
26230 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
26240 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
26250 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
26260 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
26270 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
26280 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
26290 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
262a0 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
262b0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
262c0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
262d0 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
262e0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
262f0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
26300 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
26310 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26320 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
26330 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
26340 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26350 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
26360 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
26370 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
26380 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
26390 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
263a0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
263b0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
263c0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
263d0 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
263e0 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
263f0 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
26400 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
26410 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
26420 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
26430 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
26440 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
26450 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
26460 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
26470 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26480 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
26490 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
264a0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
264b0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
264c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
264d0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
264e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
264f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
26500 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
26510 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
26520 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
26530 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
26540 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74  IsNull );   test
26550 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
26560 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ULL );.      ass
26570 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
26580 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74  =OP_NotNull ); t
26590 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
265a0 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
265b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
265c0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
265d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
265e0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
265f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26600 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
26610 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  est);.      Vdbe
26620 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
26630 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
26640 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
26650 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
26660 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
26670 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
26680 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
26690 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
266a0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
266b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
266c0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
266d0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
266e0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
266f0 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
26700 74 65 33 45 78 70 72 49 66 54 72 75 65 2c 20 6a  te3ExprIfTrue, j
26710 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
26720 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
26730 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26740 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
26750 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
26760 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
26770 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
26780 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
26790 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
267a0 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c  ull = jumpIfNull
267b0 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66   ? dest : destIf
267c0 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c  False;.      sql
267d0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
267e0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
267f0 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
26800 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
26810 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
26820 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
26830 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
26840 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
26850 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
26860 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
26870 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
26880 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
26890 3a 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72  :.      if( expr
268a0 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
268b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
268c0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
268d0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
268e0 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
268f0 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
26900 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  .        /* No-o
26910 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
26920 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
26930 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
26940 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
26950 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
26960 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26970 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
26980 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
26990 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
269a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
269b0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
269c0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
269d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
269e0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
269f0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
26a00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26a10 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
26a20 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
26a30 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
26a40 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
26a50 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
26a60 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
26a70 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
26a80 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
26a90 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
26aa0 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
26ab0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
26ac0 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
26ad0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
26ae0 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
26af0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
26b00 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
26b10 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
26b20 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
26b30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
26b40 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
26b50 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
26b60 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
26b70 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
26b80 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
26b90 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
26ba0 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
26bb0 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
26bc0 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
26bd0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
26be0 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
26bf0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
26c00 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
26c10 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
26c20 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
26c30 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
26c40 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
26c50 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
26c60 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
26c70 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
26c80 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
26c90 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
26ca0 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
26cb0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
26cc0 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
26cd0 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  n; /* Existence 
26ce0 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
26cf0 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
26d00 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
26d10 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
26d20 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
26d30 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
26d40 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
26d50 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
26d60 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
26d70 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
26d80 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
26d90 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
26da0 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
26db0 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
26dc0 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
26dd0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
26de0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
26df0 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
26e00 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
26e10 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
26e20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
26e30 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
26e40 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
26e60 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
26e70 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
26e80 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
26e90 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
26ea0 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
26eb0 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
26ec0 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
26ed0 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
26ee0 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
26ef0 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
26f00 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
26f10 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
26f20 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
26f30 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
26f40 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
26f50 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
26f60 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
26f70 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
26f80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
26f90 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
26fa0 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
26fb0 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
26fc0 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
26fd0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
26fe0 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
26ff0 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
27000 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
27010 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
27020 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
27030 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
27040 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27050 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
27060 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
27070 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
27080 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
27090 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
270a0 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
270b0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
270c0 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
270d0 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
270e0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
270f0 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
27100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
27110 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
27120 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
27130 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
27140 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
27150 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
27160 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
27170 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
27180 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
27190 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
271a0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
271b0 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
271c0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
271d0 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
271e0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
271f0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
27200 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
27210 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
27220 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
27230 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
27240 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
27250 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
27260 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
27270 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
27280 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27290 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
272a0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
272b0 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
272c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
272d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
272e0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
272f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27300 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
27310 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
27320 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49   jumpIfNull^SQLI
27330 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
27340 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27350 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
27360 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
27370 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
27380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27390 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
273a0 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
273b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
273c0 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
273d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
273e0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
273f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27400 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
27410 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
27420 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
27430 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27440 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27450 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69  TRUTH: {.      i
27460 6e 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49  nt isNot;   /* I
27470 53 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53  S NOT TRUE or IS
27480 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20   NOT FALSE */.  
27490 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20      int isTrue; 
274a0 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49   /* IS TRUE or I
274b0 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20  S NOT TRUE */.  
274c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
274d0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
274e0 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78       isNot = pEx
274f0 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f  pr->op2==TK_ISNO
27500 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20  T;.      isTrue 
27510 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  = sqlite3ExprTru
27520 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70  thValue(pExpr->p
27530 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65  Right);.      te
27540 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26  stcase( isTrue &
27550 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20  & isNot );.     
27560 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72   testcase( !isTr
27570 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20  ue && isNot );. 
27580 20 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20       if( isTrue 
27590 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20  ^ isNot ){.     
275a0 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 61 6e     /* IS TRUE an
275b0 64 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a  d IS NOT FALSE *
275c0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
275d0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
275e0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
275f0 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20  t, dest,.       
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27610 20 20 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20      isNot ? 0 : 
27620 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
27630 4c 29 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65  L);..      }else
27640 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20  {.        /* IS 
27650 46 41 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f 54  FALSE and IS NOT
27660 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 20   TRUE */.       
27670 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
27680 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
27690 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20  ->pLeft, dest,. 
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276b0 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f           isNot ?
276c0 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50   0 : SQLITE_JUMP
276d0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d  IFNULL);.      }
276e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
276f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27700 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
27710 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73  ISNOT:.      tes
27720 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
27730 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
27740 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
27750 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
27760 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45  ;.      op = (pE
27770 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20  xpr->op==TK_IS) 
27780 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b  ? TK_NE : TK_EQ;
27790 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c  .      jumpIfNul
277a0 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  l = SQLITE_NULLE
277b0 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  Q;.      /* Fall
277c0 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73   thru */.    cas
277d0 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
277e0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
277f0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
27800 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
27810 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
27820 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
27830 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
27840 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e  IsVector(pExpr->
27850 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65  pLeft) ) goto de
27860 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20  fault_expr;.    
27870 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27880 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27890 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
278a0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
278b0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
278c0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
278d0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
278e0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
278f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
27900 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
27910 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
27920 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
27930 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
27940 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
27950 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
27960 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
27970 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
27980 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
27990 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
279a0 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
279b0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
279c0 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
279d0 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
279e0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
279f0 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
27a00 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
27a10 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
27a20 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
27a30 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
27a40 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
27a50 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
27a60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
27a70 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
27a80 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
27a90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
27aa0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
27ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
27ac0 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
27ad0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
27ae0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27af0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
27b00 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
27b10 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
27b20 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27b30 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
27b40 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
27b50 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l==SQLITE_NULLEQ
27b60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27b70 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
27b80 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
27b90 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
27ba0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
27bb0 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
27bc0 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
27bd0 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
27be0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
27bf0 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
27c00 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
27c10 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LEQ);.      test
27c20 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
27c30 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
27c40 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
27c50 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
27c60 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
27c70 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
27c80 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
27c90 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
27ca0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
27cb0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
27cc0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
27cd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27ce0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
27cf0 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
27d00 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
27d10 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20  =TK_ISNULL );   
27d20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27d30 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
27d40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27d50 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
27d60 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67   );  VdbeCoverag
27d70 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
27d80 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  TNULL);.      te
27d90 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
27da0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
27db0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
27dc0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
27dd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27de0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
27df0 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
27e00 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
27e10 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c  pExpr, dest, sql
27e20 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c  ite3ExprIfFalse,
27e30 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
27e40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
27e50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27e60 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
27e70 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
27e80 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66        if( jumpIf
27e90 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
27ea0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
27eb0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
27ec0 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20   dest, dest);.  
27ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27ee0 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
27ef0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
27f00 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
27f10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27f20 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
27f30 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
27f40 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
27f50 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27f60 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
27f70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
27f80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27f90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
27fa0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65  efault: {.    de
27fb0 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20  fault_expr: .   
27fc0 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79     if( exprAlway
27fd0 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
27fe0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27ff0 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
28000 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
28010 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  f( exprAlwaysTru
28020 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
28030 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
28040 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28050 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
28060 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
28070 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
28080 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
28090 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
280a0 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p3(v, OP_IfNot, 
280b0 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
280c0 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
280d0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
280e0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
280f0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
28100 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
28110 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
28120 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
28130 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28140 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
28150 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
28160 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
28170 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
28180 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
28190 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f   regFree2);.}../
281a0 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65  *.** Like sqlite
281b0 33 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 65  3ExprIfFalse() e
281c0 78 63 65 70 74 20 74 68 61 74 20 61 20 63 6f 70  xcept that a cop
281d0 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78  y is made of pEx
281e0 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64  pr before.** cod
281f0 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e  e generation, an
28200 64 20 74 68 61 74 20 63 6f 70 79 20 69 73 20 64  d that copy is d
28210 65 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f 64  eleted after cod
28220 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68  e generation. Th
28230 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68  is.** ensures th
28240 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
28250 70 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67  pExpr is unchang
28260 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
28270 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75  te3ExprIfFalseDu
28280 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
28290 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
282a0 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49  t dest,int jumpI
282b0 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65  fNull){.  sqlite
282c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
282d0 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70  db;.  Expr *pCop
282e0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  y = sqlite3ExprD
282f0 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
28300 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
28310 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
28320 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
28330 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43  False(pParse, pC
28340 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  opy, dest, jumpI
28350 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  fNull);.  }.  sq
28360 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
28370 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f  db, pCopy);.}../
28380 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
28390 70 56 61 72 20 69 73 20 67 75 61 72 61 6e 74 65  pVar is guarante
283a0 65 64 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20  ed to be an SQL 
283b0 76 61 72 69 61 62 6c 65 2e 20 70 45 78 70 72 20  variable. pExpr 
283c0 6d 61 79 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79  may be any.** ty
283d0 70 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  pe of expression
283e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
283f0 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c   is a simple SQL
28400 20 76 61 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65   value - an inte
28410 67 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e  ger, real, strin
28420 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55  g, blob.** or NU
28430 4c 4c 20 76 61 6c 75 65 20 2d 20 74 68 65 6e 20  LL value - then 
28440 74 68 65 20 56 44 42 45 20 63 75 72 72 65 6e 74  the VDBE current
28450 6c 79 20 62 65 69 6e 67 20 70 72 65 70 61 72 65  ly being prepare
28460 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a  d is configured.
28470 2a 2a 20 74 6f 20 72 65 2d 70 72 65 70 61 72 65  ** to re-prepare
28480 20 65 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77   each time a new
28490 20 76 61 6c 75 65 20 69 73 20 62 6f 75 6e 64 20   value is bound 
284a0 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61 72  to variable pVar
284b0 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e  ..**.** Addition
284c0 61 6c 6c 79 2c 20 69 66 20 70 45 78 70 72 20 69  ally, if pExpr i
284d0 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76  s a simple SQL v
284e0 61 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c  alue and the val
284f0 75 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d  ue is the.** sam
28500 65 20 61 73 20 74 68 61 74 20 63 75 72 72 65 6e  e as that curren
28510 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20 76 61 72  tly bound to var
28520 69 61 62 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d  iable pVar, non-
28530 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
28540 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
28550 69 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  if the values ar
28560 65 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 6f  e not the same o
28570 72 20 69 66 20 70 45 78 70 72 20 69 73 20 6e 6f  r if pExpr is no
28580 74 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51  t a simple.** SQ
28590 4c 20 76 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73  L value, zero is
285a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
285b0 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 6d  atic int exprCom
285c0 70 61 72 65 56 61 72 69 61 62 6c 65 28 50 61 72  pareVariable(Par
285d0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
285e0 20 2a 70 56 61 72 2c 20 45 78 70 72 20 2a 70 45   *pVar, Expr *pE
285f0 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 73 20  xpr){.  int res 
28600 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 72 3b  = 0;.  int iVar;
28610 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
28620 20 2a 70 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a 20   *pL, *pR = 0;. 
28630 20 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65   .  sqlite3Value
28640 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d  FromExpr(pParse-
28650 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49  >db, pExpr, SQLI
28660 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
28670 41 46 46 5f 42 4c 4f 42 2c 20 26 70 52 29 3b 0a  AFF_BLOB, &pR);.
28680 20 20 69 66 28 20 70 52 20 29 7b 0a 20 20 20 20    if( pR ){.    
28690 69 56 61 72 20 3d 20 70 56 61 72 2d 3e 69 43 6f  iVar = pVar->iCo
286a0 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  lumn;.    sqlite
286b0 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
286c0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69  pParse->pVdbe, i
286d0 56 61 72 29 3b 0a 20 20 20 20 70 4c 20 3d 20 73  Var);.    pL = s
286e0 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
286f0 6e 64 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e  ndValue(pParse->
28700 70 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72  pReprepare, iVar
28710 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  , SQLITE_AFF_BLO
28720 42 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 20 29  B);.    if( pL )
28730 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
28740 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
28750 4c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  L)==SQLITE_TEXT 
28760 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28770 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4c  e3_value_text(pL
28780 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  ); /* Make sure 
28790 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  the encoding is 
287a0 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 7d  UTF-8 */.      }
287b0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 20 30 3d  .      res =  0=
287c0 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61  =sqlite3MemCompa
287d0 72 65 28 70 4c 2c 20 70 52 2c 20 30 29 3b 0a 20  re(pL, pR, 0);. 
287e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
287f0 56 61 6c 75 65 46 72 65 65 28 70 52 29 3b 0a 20  ValueFree(pR);. 
28800 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
28810 72 65 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20  ree(pL);.  }..  
28820 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
28830 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63  *.** Do a deep c
28840 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f  omparison of two
28850 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
28860 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
28870 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65  the two.** expre
28880 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c  ssions are compl
28890 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e  etely identical.
288a0 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
288b0 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a  ey differ only.*
288c0 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f  * by a COLLATE o
288d0 70 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74  perator at the t
288e0 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72  op level.  Retur
288f0 6e 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65  n 2 if there are
28900 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20   differences.** 
28910 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74  other than the t
28920 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45  op-level COLLATE
28930 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
28940 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65   If any subeleme
28950 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70  nt of pB has Exp
28960 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74  r.iTable==(-1) t
28970 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65  hen it is allowe
28980 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20  d.** to compare 
28990 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69  equal to an equi
289a0 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69  valent element i
289b0 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69  n pA with Expr.i
289c0 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a  Table==iTab..**.
289d0 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65 20 6d  ** The pA side m
289e0 69 67 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b  ight be using TK
289f0 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66 20 74  _REGISTER.  If t
28a00 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 20  hat is the case 
28a10 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74  and pB is.** not
28a20 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
28a30 45 52 20 62 75 74 20 69 73 20 6f 74 68 65 72 77  ER but is otherw
28a40 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20  ise equivalent, 
28a50 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
28a60 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  n 0..**.** Somet
28a70 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e  imes this routin
28a80 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20  e will return 2 
28a90 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20  even if the two 
28aa0 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72  expressions.** r
28ab0 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61  eally are equiva
28ac0 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e  lent.  If we can
28ad0 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74  not prove that t
28ae0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
28af0 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c  re.** identical,
28b00 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73   we return 2 jus
28b10 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53  t to be safe.  S
28b20 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
28b30 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20  e.** returns 2, 
28b40 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20  then you do not 
28b50 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20  really know for 
28b60 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74  certain if the t
28b70 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  wo.** expression
28b80 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
28b90 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20   But if you get 
28ba0 61 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c  a 0 or 1 return,
28bb0 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e   then you.** can
28bc0 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70   be sure the exp
28bd0 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
28be0 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70   same.  In the p
28bf0 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74  laces where.** t
28c00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
28c10 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  sed, it does not
28c20 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20   hurt to get an 
28c30 65 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a  extra 2 - that.*
28c40 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73  * just might res
28c50 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67  ult in some slig
28c60 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65  htly slower code
28c70 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67  .  But returning
28c80 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74  .** an incorrect
28c90 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65   0 or 1 could le
28ca0 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74  ad to a malfunct
28cb0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50  ion..**.** If pP
28cc0 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  arse is not NULL
28cd0 20 74 68 65 6e 20 54 4b 5f 56 41 52 49 41 42 4c   then TK_VARIABL
28ce0 45 20 74 65 72 6d 73 20 69 6e 20 70 41 20 77 69  E terms in pA wi
28cf0 74 68 20 62 69 6e 64 69 6e 67 73 20 69 6e 0a 2a  th bindings in.*
28d00 2a 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65  * pParse->pRepre
28d10 70 61 72 65 20 63 61 6e 20 62 65 20 6d 61 74 63  pare can be matc
28d20 68 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65  hed against lite
28d30 72 61 6c 73 20 69 6e 20 70 42 2e 20 20 54 68 65  rals in pB.  The
28d40 20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 56 64   .** pParse->pVd
28d50 62 65 2d 3e 65 78 70 6d 61 73 6b 20 62 69 74 6d  be->expmask bitm
28d60 61 73 6b 20 69 73 20 75 70 64 61 74 65 64 20 66  ask is updated f
28d70 6f 72 20 65 61 63 68 20 76 61 72 69 61 62 6c 65  or each variable
28d80 20 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20   referenced..** 
28d90 49 66 20 70 50 61 72 73 65 20 69 73 20 4e 55 4c  If pParse is NUL
28da0 4c 20 28 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61  L (the normal ca
28db0 73 65 29 20 74 68 65 6e 20 61 6e 79 20 54 4b 5f  se) then any TK_
28dc0 56 41 52 49 41 42 4c 45 20 74 65 72 6d 20 69 6e  VARIABLE term in
28dd0 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 50   .** Argument pP
28de0 61 72 73 65 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  arse should norm
28df0 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66  ally be NULL. If
28e00 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20   it is not NULL 
28e10 61 6e 64 20 70 41 20 6f 72 0a 2a 2a 20 70 42 20  and pA or.** pB 
28e20 63 61 75 73 65 73 20 61 20 72 65 74 75 72 6e 20  causes a return 
28e30 76 61 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69  value of 2..*/.i
28e40 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
28e50 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61  mpare(Parse *pPa
28e60 72 73 65 2c 20 45 78 70 72 20 2a 70 41 2c 20 45  rse, Expr *pA, E
28e70 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  xpr *pB, int iTa
28e80 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e  b){.  u32 combin
28e90 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70  edFlags;.  if( p
28ea0 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b  A==0 || pB==0 ){
28eb0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d  .    return pB==
28ec0 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a  pA ? 0 : 2;.  }.
28ed0 20 20 69 66 28 20 70 50 61 72 73 65 20 26 26 20    if( pParse && 
28ee0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  pA->op==TK_VARIA
28ef0 42 4c 45 20 26 26 20 65 78 70 72 43 6f 6d 70 61  BLE && exprCompa
28f00 72 65 56 61 72 69 61 62 6c 65 28 70 50 61 72 73  reVariable(pPars
28f10 65 2c 20 70 41 2c 20 70 42 29 20 29 7b 0a 20 20  e, pA, pB) ){.  
28f20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
28f30 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20    combinedFlags 
28f40 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42  = pA->flags | pB
28f50 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63  ->flags;.  if( c
28f60 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
28f70 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
28f80 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
28f90 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e  &pB->flags&EP_In
28fa0 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41  tValue)!=0 && pA
28fb0 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e  ->u.iValue==pB->
28fc0 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  u.iValue ){.    
28fd0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
28fe0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
28ff0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
29000 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  !=pB->op ){.    
29010 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pA->op==TK_C
29020 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65  OLLATE && sqlite
29030 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
29040 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70  rse, pA->pLeft,p
29050 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20  B,iTab)<2 ){.   
29060 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
29070 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f   }.    if( pB->o
29080 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
29090 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
290a0 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2c 70  are(pParse, pA,p
290b0 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29 3c 32  B->pLeft,iTab)<2
290c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
290d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   1;.    }.    re
290e0 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
290f0 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  ( pA->op!=TK_COL
29100 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54  UMN && pA->op!=T
29110 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20  K_AGG_COLUMN && 
29120 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a  pA->u.zToken ){.
29130 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d      if( pA->op==
29140 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
29150 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29160 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54  StrICmp(pA->u.zT
29170 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
29180 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32  n)!=0 ) return 2
29190 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
291a0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pA->op==TK_COLLA
291b0 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
291c0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
291d0 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
291e0 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20  >u.zToken)!=0 ) 
291f0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65  return 2;.    }e
29200 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 70  lse if( strcmp(p
29210 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
29220 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a  u.zToken)!=0 ){.
29230 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
29240 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
29250 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
29260 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
29270 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
29280 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  nct) ) return 2;
29290 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63  .  if( ALWAYS((c
292a0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
292b0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29  P_TokenOnly)==0)
292c0 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62   ){.    if( comb
292d0 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78  inedFlags & EP_x
292e0 49 73 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  IsSelect ) retur
292f0 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 28 63 6f  n 2;.    if( (co
29300 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
29310 5f 46 69 78 65 64 43 6f 6c 29 3d 3d 30 0a 20 20  _FixedCol)==0.  
29320 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
29330 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
29340 20 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e   pA->pLeft, pB->
29350 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72  pLeft, iTab) ) r
29360 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
29370 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29380 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e  are(pParse, pA->
29390 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
293a0 68 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  ht, iTab) ) retu
293b0 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
293c0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
293d0 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74  pare(pA->x.pList
293e0 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  , pB->x.pList, i
293f0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
29400 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 63 6f  .    assert( (co
29410 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
29420 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a  _Reduced)==0 );.
29430 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d      if( pA->op!=
29440 54 4b 5f 53 54 52 49 4e 47 20 26 26 20 70 41 2d  TK_STRING && pA-
29450 3e 6f 70 21 3d 54 4b 5f 54 52 55 45 46 41 4c 53  >op!=TK_TRUEFALS
29460 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
29470 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
29480 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
29490 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   2;.      if( pA
294a0 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
294b0 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20  able .       && 
294c0 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  (pA->iTable!=iTa
294d0 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69  b || NEVER(pB->i
294e0 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74  Table>=0)) ) ret
294f0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 23 69 66  urn 2;.    }.#if
29500 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29510 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20  _WINDOWFUNC.    
29520 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e  /* Justification
29530 20 66 6f 72 20 74 68 65 20 61 73 73 65 72 74 28   for the assert(
29540 29 3a 0a 20 20 20 20 2a 2a 20 77 69 6e 64 6f 77  ):.    ** window
29550 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20   functions have 
29560 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  p->op==TK_FUNCTI
29570 4f 4e 20 62 75 74 20 61 67 67 72 65 67 61 74 65  ON but aggregate
29580 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 2a   functions.    *
29590 2a 20 68 61 76 65 20 70 2d 3e 6f 70 3d 3d 54 4b  * have p->op==TK
295a0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 20 20  _AGG_FUNCTION.  
295b0 53 6f 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f  So any compariso
295c0 6e 20 62 65 74 77 65 65 6e 20 61 6e 20 61 67 67  n between an agg
295d0 72 65 67 61 74 65 0a 20 20 20 20 2a 2a 20 66 75  regate.    ** fu
295e0 6e 63 74 69 6f 6e 20 61 6e 64 20 61 20 77 69 6e  nction and a win
295f0 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  dow function sho
29600 75 6c 64 20 68 61 76 65 20 66 61 69 6c 65 64 20  uld have failed 
29610 62 65 66 6f 72 65 20 72 65 61 63 68 69 6e 67 0a  before reaching.
29620 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
29630 74 2e 20 20 41 6e 64 2c 20 69 74 20 69 73 20 6e  t.  And, it is n
29640 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68  ot possible to h
29650 61 76 65 20 61 20 77 69 6e 64 6f 77 20 66 75 6e  ave a window fun
29660 63 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  ction and.    **
29670 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69   a scalar functi
29680 6f 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  on with the same
29690 20 6e 61 6d 65 20 61 6e 64 20 6e 75 6d 62 65 72   name and number
296a0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
296b0 53 6f 0a 20 20 20 20 2a 2a 20 69 66 20 77 65 20  So.    ** if we 
296c0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
296d0 2c 20 65 69 74 68 65 72 20 41 20 61 6e 64 20 42  , either A and B
296e0 20 62 6f 74 68 20 77 69 6e 64 6f 77 20 66 75 6e   both window fun
296f0 63 74 69 6f 6e 73 20 6f 72 0a 20 20 20 20 2a 2a  ctions or.    **
29700 20 6e 65 69 74 68 65 72 20 61 72 65 20 61 20 77   neither are a w
29710 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 2e  indow functions.
29720 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
29730 28 70 41 2d 3e 70 57 69 6e 3d 3d 30 29 3d 3d 28  (pA->pWin==0)==(
29740 70 42 2d 3e 70 57 69 6e 3d 3d 30 29 20 29 3b 0a  pB->pWin==0) );.
29750 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 57 69  .    if( pA->pWi
29760 6e 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  n!=0 ){.      if
29770 28 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  ( sqlite3WindowC
29780 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 70 41  ompare(pParse,pA
29790 2d 3e 70 57 69 6e 2c 70 42 2d 3e 70 57 69 6e 29  ->pWin,pB->pWin)
297a0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  !=0 ) return 2;.
297b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
297c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
297d0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
297e0 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
297f0 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ts.  Return 0 if
29800 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
29810 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d  cal and .** non-
29820 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66  zero if they dif
29830 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
29840 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
29850 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
29860 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
29870 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
29880 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
29890 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
298a0 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
298b0 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
298c0 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
298d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
298e0 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
298f0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
29900 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
29910 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
29920 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
29930 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
29940 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
29950 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
29960 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
29970 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
29980 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
29990 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
299a0 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
299b0 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
299c0 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
299d0 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
299e0 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
299f0 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
29a00 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
29a10 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
29a20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
29a30 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
29a40 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
29a50 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
29a60 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
29a70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
29a80 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
29a90 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65  =0 && pB==0 ) re
29aa0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
29ab0 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72  ==0 || pB==0 ) r
29ac0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
29ad0 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45  A->nExpr!=pB->nE
29ae0 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  xpr ) return 1;.
29af0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
29b00 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
29b10 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d    Expr *pExprA =
29b20 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pA->a[i].pExpr;
29b30 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
29b40 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78  B = pB->a[i].pEx
29b50 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e  pr;.    if( pA->
29b60 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d  a[i].sortOrder!=
29b70 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pB->a[i].sortOrd
29b80 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  er ) return 1;. 
29b90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
29ba0 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78  prCompare(0, pEx
29bb0 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61  prA, pExprB, iTa
29bc0 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
29bd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
29be0 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c  ../*.** Like sql
29bf0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
29c00 29 20 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45  ) except COLLATE
29c10 20 6f 70 65 72 61 74 6f 72 73 20 61 74 20 74 68   operators at th
29c20 65 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61  e top-level.** a
29c30 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  re ignored..*/.i
29c40 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
29c50 6d 70 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a  mpareSkip(Expr *
29c60 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e  pA, Expr *pB, in
29c70 74 20 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72  t iTab){.  retur
29c80 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  n sqlite3ExprCom
29c90 70 61 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20  pare(0,.        
29ca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
29cb0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c  SkipCollate(pA),
29cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
29cd0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
29ce0 6c 61 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20  late(pB),.      
29cf0 20 20 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a         iTab);.}.
29d00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
29d10 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f  ue if we can pro
29d20 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20  ve the pE2 will 
29d30 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69  always be true i
29d40 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65  f pE1 is.** true
29d50 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
29d60 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d  if we cannot com
29d70 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20  plete the proof 
29d80 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a  or if pE2 might.
29d90 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78  ** be false.  Ex
29da0 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
29db0 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20    pE1: x==5     
29dc0 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
29dd0 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
29de0 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
29df0 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a   x>0        pE2:
29e00 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
29e10 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
29e20 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31  **     pE1: x=21
29e30 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31         pE2: x=21
29e40 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73   OR y=43     Res
29e50 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
29e60 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20   pE1: x!=123    
29e70 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
29e80 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
29e90 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
29ea0 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20  x!=?1      pE2: 
29eb0 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
29ec0 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
29ed0 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e       pE1: x IS N
29ee0 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e  ULL  pE2: x IS N
29ef0 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
29f00 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
29f10 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20  pE1: x IS ?2    
29f20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
29f30 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61  LL    Reuslt: fa
29f40 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63  lse.**.** When c
29f50 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55  omparing TK_COLU
29f60 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e  MN nodes between
29f70 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66   pE1 and pE2, if
29f80 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72   pE2 has.** Expr
29f90 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61  .iTable<0 then a
29fa0 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75  ssume a table nu
29fb0 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54  mber given by iT
29fc0 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61  ab..**.** If pPa
29fd0 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  rse is not NULL,
29fe0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
29ff0 20 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62   of bound variab
2a000 6c 65 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a  les in pE1 are .
2a010 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69  ** compared agai
2a020 6e 73 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  nst literal valu
2a030 65 73 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50  es in pE2 and pP
2a040 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70  arse->pVdbe->exp
2a050 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66  mask is.** modif
2a060 69 65 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68  ied to record wh
2a070 69 63 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62  ich bound variab
2a080 6c 65 73 20 61 72 65 20 72 65 66 65 72 65 6e 63  les are referenc
2a090 65 64 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a  ed.  If pParse .
2a0a0 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  ** is NULL, then
2a0b0 20 66 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72   false will be r
2a0c0 65 74 75 72 6e 65 64 20 69 66 20 70 45 31 20 63  eturned if pE1 c
2a0d0 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e  ontains any boun
2a0e0 64 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  d variables..**.
2a0f0 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  ** When in doubt
2a100 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  , return false. 
2a110 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20   Returning true 
2a120 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
2a130 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72  formance.** impr
2a140 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  ovement.  Return
2a150 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20  ing false might 
2a160 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61  cause a performa
2a170 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62  nce reduction, b
2a180 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c  ut.** it will al
2a190 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f  ways give the co
2a1a0 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64  rrect answer and
2a1b0 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73   is hence always
2a1c0 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   safe..*/.int sq
2a1d0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2a1e0 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72  Expr(Parse *pPar
2a1f0 73 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45  se, Expr *pE1, E
2a200 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54  xpr *pE2, int iT
2a210 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ab){.  if( sqlit
2a220 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2a230 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20  arse, pE1, pE2, 
2a240 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iTab)==0 ){.    
2a250 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2a260 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
2a270 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65  OR.   && (sqlite
2a280 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
2a290 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45  (pParse, pE1, pE
2a2a0 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a  2->pLeft, iTab).
2a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2a2c0 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2a2d0 65 73 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  esExpr(pParse, p
2a2e0 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c  E1, pE2->pRight,
2a2f0 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20   iTab) ).  ){.  
2a300 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2a310 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
2a320 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31  K_NOTNULL && pE1
2a330 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
2a340 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49  && pE1->op!=TK_I
2a350 53 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  S ){.    Expr *p
2a360 58 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  X = sqlite3ExprS
2a370 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e  kipCollate(pE1->
2a380 70 4c 65 66 74 29 3b 0a 20 20 20 20 74 65 73 74  pLeft);.    test
2a390 63 61 73 65 28 20 70 58 21 3d 70 45 31 2d 3e 70  case( pX!=pE1->p
2a3a0 4c 65 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Left );.    if( 
2a3b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a3c0 72 65 28 70 50 61 72 73 65 2c 20 70 58 2c 20 70  re(pParse, pX, p
2a3d0 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
2a3e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
2a3f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2a400 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
2a410 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 63   the Expr node c
2a420 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c 69  allback for sqli
2a430 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f  te3ExprImpliesNo
2a440 74 4e 75 6c 6c 52 6f 77 28 29 2e 0a 2a 2a 20 49  tNullRow()..** I
2a450 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
2a460 20 6e 6f 64 65 20 72 65 71 75 69 72 65 73 20 74   node requires t
2a470 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 61 74  hat the table at
2a480 20 70 57 61 6c 6b 65 72 2d 3e 69 43 75 72 0a 2a   pWalker->iCur.*
2a490 2a 20 68 61 76 65 20 61 20 6e 6f 6e 2d 4e 55 4c  * have a non-NUL
2a4a0 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73  L column, then s
2a4b0 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  et pWalker->eCod
2a4c0 65 20 74 6f 20 31 20 61 6e 64 20 61 62 6f 72 74  e to 1 and abort
2a4d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a4e0 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f  impliesNotNullRo
2a4f0 77 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  w(Walker *pWalke
2a500 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2a510 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2a520 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
2a530 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
2a540 73 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  se expressions a
2a550 6e 64 20 73 6f 20 69 74 0a 20 20 2a 2a 20 63 61  nd so it.  ** ca
2a560 6e 6e 6f 74 20 68 61 76 65 20 61 6e 79 20 54 4b  nnot have any TK
2a570 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 65 6e 74 72  _AGG_COLUMN entr
2a580 69 65 73 20 62 65 63 61 75 73 65 20 74 68 6f 73  ies because thos
2a590 65 20 61 72 65 20 6f 6e 6c 79 20 66 6f 75 6e 64  e are only found
2a5a0 0a 20 20 2a 2a 20 69 6e 20 48 41 56 49 4e 47 20  .  ** in HAVING 
2a5b0 63 6c 61 75 73 65 73 2e 20 20 57 65 20 63 61 6e  clauses.  We can
2a5c0 20 67 65 74 20 61 20 54 4b 5f 41 47 47 5f 46 55   get a TK_AGG_FU
2a5d0 4e 43 54 49 4f 4e 20 69 6e 20 61 20 57 48 45 52  NCTION in a WHER
2a5e0 45 20 63 6c 61 75 73 65 2c 0a 20 20 2a 2a 20 62  E clause,.  ** b
2a5f0 75 74 20 74 68 61 74 20 69 73 20 61 6e 20 69 6c  ut that is an il
2a600 6c 65 67 61 6c 20 63 6f 6e 73 74 72 75 63 74 20  legal construct 
2a610 61 6e 64 20 74 68 65 20 71 75 65 72 79 20 77 69  and the query wi
2a620 6c 6c 20 62 65 20 72 65 6a 65 63 74 65 64 20 61  ll be rejected a
2a630 74 0a 20 20 2a 2a 20 61 20 6c 61 74 65 72 20 73  t.  ** a later s
2a640 74 61 67 65 20 6f 66 20 70 72 6f 63 65 73 73 69  tage of processi
2a650 6e 67 2c 20 73 6f 20 74 68 65 20 54 4b 5f 41 47  ng, so the TK_AG
2a660 47 5f 46 55 4e 43 54 49 4f 4e 20 63 61 73 65 20  G_FUNCTION case 
2a670 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65  does not.  ** ne
2a680 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
2a690 72 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 61  red here. */.  a
2a6a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
2a6b0 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
2a6c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2a6d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
2a6e0 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 0a 20 20  _FUNCTION );..  
2a6f0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
2a700 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
2a710 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
2a720 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73 77   WRC_Prune;.  sw
2a730 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
2a740 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
2a750 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  SNOT:.    case T
2a760 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  K_NOT:.    case 
2a770 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
2a780 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
2a790 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
2a7a0 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20 20  ase TK_CASE:.   
2a7b0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20   case TK_IN:.   
2a7c0 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
2a7d0 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  N:.      testcas
2a7e0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2a7f0 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
2a800 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2a810 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20  >op==TK_NOT );. 
2a820 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2a830 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
2a840 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
2a850 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2a860 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
2a870 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2a880 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ->op==TK_OR );. 
2a890 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2a8a0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53  Expr->op==TK_CAS
2a8b0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
2a8c0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2a8d0 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74  TK_IN );.      t
2a8e0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2a8f0 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
2a900 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2a910 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 63  WRC_Prune;.    c
2a920 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
2a930 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
2a940 2d 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d  ->u.iCur==pExpr-
2a950 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  >iTable ){.     
2a960 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2a970 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  e = 1;.        r
2a980 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2a990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2a9a0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2a9b0 0a 0a 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ..    /* Virtual
2a9c0 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c 6c 6f   tables are allo
2a9d0 77 65 64 20 74 6f 20 75 73 65 20 63 6f 6e 73 74  wed to use const
2a9e0 72 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e 55  raints like x=NU
2a9f0 4c 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 61  LL.  So.    ** a
2aa00 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
2aa10 6d 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20 70  m x=y does not p
2aa20 72 6f 76 65 20 74 68 61 74 20 79 20 69 73 20 6e  rove that y is n
2aa30 6f 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20 20  ot null if x.   
2aa40 20 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75 6d   ** is the colum
2aa50 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74  n of a virtual t
2aa60 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  able */.    case
2aa70 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65   TK_EQ:.    case
2aa80 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
2aa90 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
2aaa0 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
2aab0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
2aac0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74 65   TK_GE:.      te
2aad0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2aae0 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
2aaf0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2ab00 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  r->op==TK_NE );.
2ab10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ab20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
2ab30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2ab40 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2ab50 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
2ab60 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2ab70 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
2ab80 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2ab90 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  r->op==TK_GE );.
2aba0 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72        if( (pExpr
2abb0 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
2abc0 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74  COLUMN && IsVirt
2abd0 75 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ual(pExpr->pLeft
2abe0 2d 3e 70 54 61 62 29 29 0a 20 20 20 20 20 20 20  ->pTab)).       
2abf0 7c 7c 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68  || (pExpr->pRigh
2ac00 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
2ac10 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 45   && IsVirtual(pE
2ac20 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 54 61  xpr->pRight->pTa
2ac30 62 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  b)).      ){.   
2ac40 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2ac50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
2ac60 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2ac70 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2ac80 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  inue;.  }.}../*.
2ac90 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28  ** Return true (
2aca0 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 65 78 70  non-zero) if exp
2acb0 72 65 73 73 69 6f 6e 20 70 20 63 61 6e 20 6f 6e  ression p can on
2acc0 6c 79 20 62 65 20 74 72 75 65 20 69 66 20 61 74  ly be true if at
2acd0 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f   least.** one co
2ace0 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 54  lumn of table iT
2acf0 61 62 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20  ab is non-null. 
2ad00 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2ad10 20 72 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20   return true.** 
2ad20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  if expression p 
2ad30 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 4e  will always be N
2ad40 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20 69 66 20  ULL or false if 
2ad50 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  every column of 
2ad60 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e  iTab.** is NULL.
2ad70 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 6e 65 67  .**.** False neg
2ad80 61 74 69 76 65 73 20 61 72 65 20 61 63 63 65 70  atives are accep
2ad90 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
2ada0 20 77 6f 72 64 73 2c 20 69 74 20 69 73 20 6f 6b   words, it is ok
2adb0 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65   to return.** ze
2adc0 72 6f 20 65 76 65 6e 20 69 66 20 65 78 70 72 65  ro even if expre
2add0 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 6e 65 76  ssion p will nev
2ade0 65 72 20 62 65 20 74 72 75 65 20 6f 66 20 65 76  er be true of ev
2adf0 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54  ery column of iT
2ae00 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 20 20  ab.** is NULL.  
2ae10 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
2ae20 20 69 73 20 6d 65 72 65 6c 79 20 61 20 6d 69 73   is merely a mis
2ae30 73 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  sed optimization
2ae40 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a   opportunity..**
2ae50 0a 2a 2a 20 46 61 6c 73 65 20 70 6f 73 69 74 69  .** False positi
2ae60 76 65 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ves are not allo
2ae70 77 65 64 2c 20 68 6f 77 65 76 65 72 2e 20 20 41  wed, however.  A
2ae80 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 20   false positive 
2ae90 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
2aea0 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e   an incorrect an
2aeb0 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  swer..**.** Term
2aec0 73 20 6f 66 20 70 20 74 68 61 74 20 61 72 65 20  s of p that are 
2aed0 6d 61 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46  marked with EP_F
2aee0 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64 20 68 65 6e  romJoin (and hen
2aef0 63 65 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f  ce that come fro
2af00 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55  m.** the ON or U
2af10 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
2af20 4c 45 46 54 20 4a 4f 49 4e 53 29 20 61 72 65 20  LEFT JOINS) are 
2af30 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
2af40 65 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a  e analysis..**.*
2af50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2af60 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
2af70 69 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  if a LEFT JOIN c
2af80 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  an be converted 
2af90 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e  into.** an ordin
2afa0 61 72 79 20 4a 4f 49 4e 2e 20 20 54 68 65 20 70  ary JOIN.  The p
2afb0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2afc0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2afd0 49 66 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  If the WHERE.** 
2afe0 63 6c 61 75 73 65 20 72 65 71 75 69 72 65 73 20  clause requires 
2aff0 74 68 61 74 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e  that some column
2b000 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
2b010 62 6c 65 20 6f 66 20 74 68 65 20 4c 45 46 54 20  ble of the LEFT 
2b020 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e  JOIN.** be non-N
2b030 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4c 45  ULL, then the LE
2b040 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 73  FT JOIN can be s
2b050 61 66 65 6c 79 20 63 6f 6e 76 65 72 74 65 64 20  afely converted 
2b060 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e  into an.** ordin
2b070 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74  ary join..*/.int
2b080 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2b090 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78  iesNonNullRow(Ex
2b0a0 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 29  pr *p, int iTab)
2b0b0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2b0c0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
2b0d0 3d 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  = impliesNotNull
2b0e0 52 6f 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  Row;.  w.xSelect
2b0f0 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Callback = 0;.  
2b100 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2b110 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 65 43 6f 64  k2 = 0;.  w.eCod
2b120 65 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 69 43 75  e = 0;.  w.u.iCu
2b130 72 20 3d 20 69 54 61 62 3b 0a 20 20 73 71 6c 69  r = iTab;.  sqli
2b140 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
2b150 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
2b160 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  Code;.}../*.** A
2b170 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2b180 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2b190 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79  cture is used by
2b1a0 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72   the tree walker
2b1b0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
2b1c0 20 69 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   if an expressio
2b1d0 6e 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74  n can be evaluat
2b1e0 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 65 20  ed by reference 
2b1f0 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  to the.** index 
2b200 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61  only, without ha
2b210 76 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61  ving to do a sea
2b220 72 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72  rch for the corr
2b230 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62  esponding.** tab
2b240 6c 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49  le entry.  The I
2b250 64 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65  dxCover.pIdx fie
2b260 6c 64 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e  ld is the index.
2b270 20 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a    IdxCover.iCur.
2b280 2a 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  ** is the cursor
2b290 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a   for the table..
2b2a0 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76  */.struct IdxCov
2b2b0 65 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  er {.  Index *pI
2b2c0 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dx;     /* The i
2b2d0 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65  ndex to be teste
2b2e0 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a  d for coverage *
2b2f0 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
2b300 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
2b310 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
2b320 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ble correspondin
2b330 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a  g to the index *
2b340 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  /.};../*.** Chec
2b350 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
2b360 65 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 73  e are references
2b370 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   to columns in t
2b380 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72  able .** pWalker
2b390 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69  ->u.pIdxCover->i
2b3a0 43 75 72 20 63 61 6e 20 62 65 20 73 61 74 69 73  Cur can be satis
2b3b0 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 69  fied using the i
2b3c0 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d  ndex.** pWalker-
2b3d0 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49  >u.pIdxCover->pI
2b3e0 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  dx..*/.static in
2b3f0 74 20 65 78 70 72 49 64 78 43 6f 76 65 72 28 57  t exprIdxCover(W
2b400 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2b410 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2b420 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
2b430 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70  K_COLUMN.   && p
2b440 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
2b450 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
2b460 65 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73  er->iCur.   && s
2b470 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
2b480 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  dex(pWalker->u.p
2b490 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20  IdxCover->pIdx, 
2b4a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c  pExpr->iColumn)<
2b4b0 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  0.  ){.    pWalk
2b4c0 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20  er->eCode = 1;. 
2b4d0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
2b4e0 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ort;.  }.  retur
2b4f0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2b500 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
2b510 6e 65 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70  ne if an index p
2b520 49 64 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74  Idx on table wit
2b530 68 20 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f  h cursor iCur co
2b540 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74  ntains will.** t
2b550 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
2b560 78 70 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75  xpr.  Return tru
2b570 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 64  e if the index d
2b580 6f 65 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a  oes cover the.**
2b590 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
2b5a0 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 45 78  false if the pEx
2b5b0 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  pr expression re
2b5c0 66 65 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63  ferences table c
2b5d0 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61  olumns.** that a
2b5e0 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20  re not found in 
2b5f0 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  the index pIdx..
2b600 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63  **.** An index c
2b610 6f 76 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65  overing an expre
2b620 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ssion means that
2b630 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2b640 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61  can be.** evalua
2b650 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74  ted using only t
2b660 68 65 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74  he index and wit
2b670 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c  hout having to l
2b680 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72  ookup the.** cor
2b690 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
2b6a0 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   entry..*/.int s
2b6b0 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65  qlite3ExprCovere
2b6c0 64 42 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72  dByIndex(.  Expr
2b6d0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
2b6e0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
2b6f0 62 65 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69  be tested */.  i
2b700 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
2b710 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
2b720 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2b730 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
2b740 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ble */.  Index *
2b750 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20  pIdx         /* 
2b760 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d  The index that m
2b770 69 67 68 74 20 62 65 20 75 73 65 64 20 66 6f 72  ight be used for
2b780 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a   coverage */.){.
2b790 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
2b7a0 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 78 63  ruct IdxCover xc
2b7b0 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c  ov;.  memset(&w,
2b7c0 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
2b7d0 20 20 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43    xcov.iCur = iC
2b7e0 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20  ur;.  xcov.pIdx 
2b7f0 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70  = pIdx;.  w.xExp
2b800 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
2b810 49 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e  IdxCover;.  w.u.
2b820 70 49 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f  pIdxCover = &xco
2b830 76 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  v;.  sqlite3Walk
2b840 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
2b850 0a 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f  .  return !w.eCo
2b860 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  de;.}.../*.** An
2b870 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2b880 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2b890 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
2b8a0 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
2b8b0 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65  ** to count refe
2b8c0 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20  rences to table 
2b8d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61  columns in the a
2b8e0 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a  rguments of an .
2b8f0 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ** aggregate fun
2b900 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20  ction, in order 
2b910 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2b920 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74  .** sqlite3Funct
2b930 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75  ionThisSrc() rou
2b940 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tine..*/.struct 
2b950 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63  SrcCount {.  Src
2b960 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a  List *pSrc;   /*
2b970 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20   One particular 
2b980 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61  FROM clause in a
2b990 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f   nested query */
2b9a0 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20  .  int nThis;   
2b9b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2b9c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
2b9d0 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69  olumns in pSrcLi
2b9e0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68  st */.  int nOth
2b9f0 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  er;      /* Numb
2ba00 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2ba10 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f   to columns in o
2ba20 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
2ba30 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
2ba40 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
2ba50 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2ba60 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61   columns..*/.sta
2ba70 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43  tic int exprSrcC
2ba80 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  ount(Walker *pWa
2ba90 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
2baa0 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56  r){.  /* The NEV
2bab0 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f  ER() on the seco
2bac0 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75  nd term is becau
2bad0 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  se sqlite3Functi
2bae0 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a  onUsesThisSrc().
2baf0 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63    ** is always c
2bb00 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c  alled before sql
2bb10 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2bb20 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20  ggregates() and 
2bb30 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43  so the.  ** TK_C
2bb40 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20  OLUMNs have not 
2bb50 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  yet been convert
2bb60 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  ed into TK_AGG_C
2bb70 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20  OLUMN.  If.  ** 
2bb80 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
2bb90 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20  sesThisSrc() is 
2bba0 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  used differently
2bbb0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
2bbc0 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29  the.  ** NEVER()
2bbd0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
2bbe0 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69   removed. */.  i
2bbf0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
2bc00 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52  _COLUMN || NEVER
2bc10 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  (pExpr->op==TK_A
2bc20 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20  GG_COLUMN) ){.  
2bc30 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
2bc40 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20  uct SrcCount *p 
2bc50 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72  = pWalker->u.pSr
2bc60 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c  cCount;.    SrcL
2bc70 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
2bc80 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72  Src;.    int nSr
2bc90 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d  c = pSrc ? pSrc-
2bca0 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66  >nSrc : 0;.    f
2bcb0 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20  or(i=0; i<nSrc; 
2bcc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
2bcd0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
2bce0 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
2bcf0 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
2bd00 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20  .    if( i<nSrc 
2bd10 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69  ){.      p->nThi
2bd20 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s++;.    }else{.
2bd30 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b        p->nOther+
2bd40 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
2bd50 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2bd60 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  ue;.}../*.** Det
2bd70 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66  ermine if any of
2bd80 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   the arguments t
2bd90 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63  o the pExpr Func
2bda0 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a  tion reference.*
2bdb0 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74  * pSrcList.  Ret
2bdc0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79  urn true if they
2bdd0 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72   do.  Also retur
2bde0 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75  n true if the fu
2bdf0 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f  nction.** has no
2be00 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61   arguments or ha
2be10 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20  s only constant 
2be20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
2be30 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70  rn false if pExp
2be40 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20  r.** references 
2be50 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20  columns but not 
2be60 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65  columns of table
2be70 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c  s found in pSrcL
2be80 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
2be90 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
2bea0 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78  hisSrc(Expr *pEx
2beb0 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72  pr, SrcList *pSr
2bec0 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72  cList){.  Walker
2bed0 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   w;.  struct Src
2bee0 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73  Count cnt;.  ass
2bef0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
2bf00 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
2bf10 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
2bf20 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f  back = exprSrcCo
2bf30 75 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  unt;.  w.xSelect
2bf40 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Callback = 0;.  
2bf50 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20  w.u.pSrcCount = 
2bf60 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63  &cnt;.  cnt.pSrc
2bf70 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63   = pSrcList;.  c
2bf80 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20  nt.nThis = 0;.  
2bf90 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a  cnt.nOther = 0;.
2bfa0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
2bfb0 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d  rList(&w, pExpr-
2bfc0 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  >x.pList);.  ret
2bfd0 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20  urn cnt.nThis>0 
2bfe0 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30  || cnt.nOther==0
2bff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2c000 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
2c010 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  the pAggInfo->aC
2c020 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  ol[] array.  Ret
2c030 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
2c040 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
2c050 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
2c060 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
2c070 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
2c080 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
2c090 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73  dAggInfoColumn(s
2c0a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
2c0b0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
2c0c0 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
2c0d0 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72  Col = sqlite3Arr
2c0e0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
2c0f0 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49     db,.       pI
2c100 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20  nfo->aCol,.     
2c110 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
2c120 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20  aCol[0]),.      
2c130 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
2c140 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
2c150 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
2c160 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20    ../*.** Add a 
2c170 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
2c180 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  he pAggInfo->aFu
2c190 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  nc[] array.  Ret
2c1a0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
2c1b0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
2c1c0 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
2c1d0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
2c1e0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
2c1f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
2c200 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c  dAggInfoFunc(sql
2c210 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
2c220 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
2c230 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75   i;.  pInfo->aFu
2c240 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  nc = sqlite3Arra
2c250 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
2c260 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49    db, .       pI
2c270 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
2c280 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
2c290 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
2c2a0 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
2c2b0 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
2c2c0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
2c2d0 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
2c2e0 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62  s the xExprCallb
2c2f0 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77  ack for a tree w
2c300 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73  alker.  It is us
2c310 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ed to.** impleme
2c320 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
2c330 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2c340 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  ).  See sqlite3E
2c350 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2c360 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69  ates.** for addi
2c370 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
2c380 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
2c390 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
2c3a0 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  te(Walker *pWalk
2c3b0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2c3c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
2c3d0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
2c3e0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
2c3f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
2c400 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
2c410 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
2c420 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
2c430 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70  st;.  AggInfo *p
2c440 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 75  AggInfo = pNC->u
2c450 4e 43 2e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20  NC.pAggInfo;..  
2c460 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 63 46  assert( pNC->ncF
2c470 6c 61 67 73 20 26 20 4e 43 5f 55 41 67 67 49 6e  lags & NC_UAggIn
2c480 66 6f 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  fo );.  switch( 
2c490 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
2c4a0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
2c4b0 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
2c4c0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
2c4d0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2c4e0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
2c4f0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
2c500 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c510 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
2c520 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
2c530 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
2c540 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
2c550 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
2c560 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
2c570 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
2c580 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
2c590 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
2c5a0 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29  S(pSrcList!=0) )
2c5b0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
2c5c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2c5d0 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
2c5e0 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
2c5f0 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
2c600 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
2c610 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
2c620 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
2c630 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
2c640 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2c650 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2c660 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
2c670 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2c680 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2c690 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
2c6a0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
2c6b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2c6c0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
2c6d0 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
2c6e0 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
2c6f0 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
2c700 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
2c710 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
2c720 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
2c730 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
2c740 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
2c750 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
2c760 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
2c770 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
2c780 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
2c790 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
2c7a0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
2c7b0 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
2c7c0 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
2c7d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
2c7e0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
2c7f0 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
2c800 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
2c810 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
2c820 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
2c830 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
2c840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c850 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
2c860 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
2c870 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
2c880 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
2c890 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
2c8a0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
2c8b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2c8c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c8d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c8e0 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
2c8f0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2c900 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
2c910 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
2c920 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
2c930 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
2c940 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
2c950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c960 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
2c970 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
2c980 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2c990 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
2c9a0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
2c9b0 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
2c9c0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
2c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2c9e0 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
2c9f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
2ca00 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2ca10 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
2ca20 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
2ca30 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
2ca40 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
2ca50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2ca60 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
2ca70 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2ca80 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
2ca90 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
2caa0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2cab0 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
2cac0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
2cad0 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
2cae0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
2caf0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2cb00 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2cb10 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
2cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb30 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
2cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb50 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
2cb60 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
2cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
2cb80 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
2cb90 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
2cba0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2cbb0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2cbc0 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
2cbd0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
2cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbf0 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
2cc00 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
2cc10 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2cc20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2cc30 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
2cc40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cc50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2cc70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cc80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2cc90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2cca0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
2ccb0 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
2ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2ccd0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2cce0 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
2ccf0 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2cd20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2cd30 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
2cd40 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
2cd50 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
2cd60 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
2cd70 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
2cd80 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
2cd90 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
2cda0 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
2cdb0 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
2cdc0 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
2cdd0 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
2cde0 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
2cdf0 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
2ce00 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
2ce10 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
2ce20 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
2ce30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
2ce40 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2ce50 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
2ce60 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  duce);.         
2ce70 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
2ce80 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
2ce90 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2cea0 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
2ceb0 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
2cec0 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
2ced0 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20  (i16)k;.        
2cee0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2cef0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
2cf00 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
2cf10 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
2cf20 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
2cf30 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
2cf40 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
2cf50 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2cf60 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
2cf70 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
2cf80 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
2cf90 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
2cfa0 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63  s & NC_InAggFunc
2cfb0 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
2cfc0 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
2cfd0 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a  pth==pExpr->op2.
2cfe0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2cff0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
2d000 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
2d010 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
2d020 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
2d030 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
2d040 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
2d050 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
2d060 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
2d070 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d080 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2d090 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
2d0a0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
2d0b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2d0c0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2d0d0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
2d0e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2d0f0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2d100 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  e(0, pItem->pExp
2d110 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30  r, pExpr, -1)==0
2d120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d130 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2d140 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2d150 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
2d160 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
2d170 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
2d180 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
2d190 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
2d1a0 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
2d1b0 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
2d1c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
2d1d0 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
2d1e0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
2d1f0 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
2d200 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
2d210 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
2d220 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
2d230 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
2d240 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2d250 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2d260 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2d270 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
2d280 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
2d290 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
2d2a0 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
2d2b0 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
2d2c0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
2d2d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2d2e0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  m;.            a
2d2f0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2d300 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2d310 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
2d320 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2d330 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->pFunc = sqlite
2d340 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
2d350 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
2d360 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2d370 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20  pr->u.zToken, . 
2d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d390 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74    pExpr->x.pList
2d3a0 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   ? pExpr->x.pLis
2d3b0 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
2d3c0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
2d3d0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
2d3e0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
2d3f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
2d400 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
2d410 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
2d420 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
2d430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d440 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
2d450 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
2d460 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d480 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
2d490 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
2d4a0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
2d4b0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2d4c0 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
2d4d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2d4e0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2d4f0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
2d500 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2d510 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
2d520 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2d530 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
2d540 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20  educe);.        
2d550 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
2d560 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45  16)i;.        pE
2d570 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
2d580 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
2d590 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2d5a0 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ne;.      }else{
2d5b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2d5c0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
2d5d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2d5e0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2d5f0 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
2d600 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
2d610 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61  gatesInSelect(Wa
2d620 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
2d630 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
2d640 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d650 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
2d660 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44  pWalker->walkerD
2d670 65 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  epth++;.  return
2d680 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2d690 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61  .static void ana
2d6a0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2d6b0 53 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65 72  SelectEnd(Walker
2d6c0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
2d6d0 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55  t *pSelect){.  U
2d6e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2d6f0 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c  pSelect);.  pWal
2d700 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
2d710 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  --;.}../*.** Ana
2d720 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65  lyze the pExpr e
2d730 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
2d740 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
2d750 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
2d760 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
2d770 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
2d780 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20  dded to AggInfo 
2d790 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d  object that pNC-
2d7a0 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69  >pAggInfo.** poi
2d7b0 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f  nts to.  Additio
2d7c0 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20  nal entries are 
2d7d0 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49  made on the AggI
2d7e0 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a  nfo object as.**
2d7f0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
2d800 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
2d810 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
2d820 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
2d830 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
2d840 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
2d850 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
2d860 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
2d870 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2d880 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2d890 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
2d8a0 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
2d8b0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2d8c0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
2d8d0 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
2d8e0 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
2d8f0 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
2d900 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
2d910 65 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ect;.  w.xSelect
2d920 43 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61 6c  Callback2 = anal
2d930 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2d940 65 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77 61  electEnd;.  w.wa
2d950 6c 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20  lkerDepth = 0;. 
2d960 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
2d970 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
2d980 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
2d990 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2d9a0 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  &w, pExpr);.}../
2d9b0 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
2d9c0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2d9d0 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65  egates() for eve
2d9e0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
2d9f0 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
2da00 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  n list.  Return 
2da10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
2da20 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rors..**.** If a
2da30 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64  n error is found
2da40 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69  , the analysis i
2da50 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a  s cut short..*/.
2da60 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2da70 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
2da80 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
2da90 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2daa0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
2dab0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2dac0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
2dad0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
2dae0 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
2daf0 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
2db00 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
2db10 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  m++){.      sqli
2db20 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2db30 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
2db40 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
2db50 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2db60 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c  Allocate a singl
2db70 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66  e new register f
2db80 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73  or use to hold s
2db90 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ome intermediate
2dba0 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20   result..*/.int 
2dbb0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2dbc0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
2dbd0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
2dbe0 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20  nTempReg==0 ){. 
2dbf0 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
2dc00 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
2dc10 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61  return pParse->a
2dc20 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65  TempReg[--pParse
2dc30 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a  ->nTempReg];.}..
2dc40 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2dc50 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b   a register, mak
2dc60 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ing available fo
2dc70 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65  r reuse for some
2dc80 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73   other.** purpos
2dc90 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  e..**.** If a re
2dca0 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e  gister is curren
2dcb0 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62  tly being used b
2dcc0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
2dcd0 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  he, then.** the 
2dce0 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  deallocation is 
2dcf0 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
2dd00 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
2dd10 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a  line that uses.*
2dd20 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62  * the register b
2dd30 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f  ecomes stale..*/
2dd40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
2dd50 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73  easeTempReg(Pars
2dd60 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2dd70 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67  Reg){.  if( iReg
2dd80 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d   && pParse->nTem
2dd90 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
2dda0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
2ddb0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
2ddc0 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
2ddd0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69  >nTempReg++] = i
2dde0 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
2ddf0 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65  * Allocate or de
2de00 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b  allocate a block
2de10 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75   of nReg consecu
2de20 74 69 76 65 20 72 65 67 69 73 74 65 72 73 2e 0a  tive registers..
2de30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2de40 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  tTempRange(Parse
2de50 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52   *pParse, int nR
2de60 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  eg){.  int i, n;
2de70 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29  .  if( nReg==1 )
2de80 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47   return sqlite3G
2de90 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2dea0 29 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  );.  i = pParse-
2deb0 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
2dec0 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
2ded0 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
2dee0 3d 6e 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =n ){.    pParse
2def0 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e  ->iRangeReg += n
2df00 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
2df10 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52  >nRangeReg -= nR
2df20 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eg;.  }else{.   
2df30 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65   i = pParse->nMe
2df40 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
2df50 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
2df60 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
2df70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
2df80 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61  easeTempRange(Pa
2df90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2dfa0 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
2dfb0 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20  {.  if( nReg==1 
2dfc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
2dfd0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2dfe0 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  rse, iReg);.    
2dff0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
2e000 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e  ( nReg>pParse->n
2e010 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20  RangeReg ){.    
2e020 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2e030 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50  g = nReg;.    pP
2e040 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2e050 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
2e060 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65  *.** Mark all te
2e070 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2e080 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61  s as being unava
2e090 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
2e0a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2e0b0 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2e0c0 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
2e0d0 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65  ){.  pParse->nTe
2e0e0 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61  mpReg = 0;.  pPa
2e0f0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2e100 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c   0;.}../*.** Val
2e110 69 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65  idate that no te
2e120 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2e130 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68   falls within th
2e140 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46  e range of.** iF
2e150 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63  irst..iLast, inc
2e160 6c 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f  lusive.  This ro
2e170 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
2e180 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ll from within a
2e190 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
2e1a0 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  ments..*/.#ifdef
2e1b0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
2e1c0 74 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73  t sqlite3NoTemps
2e1d0 49 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  InRange(Parse *p
2e1e0 50 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73  Parse, int iFirs
2e1f0 74 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20  t, int iLast){. 
2e200 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50   int i;.  if( pP
2e210 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e  arse->nRangeReg>
2e220 30 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  0.   && pParse->
2e230 69 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65  iRangeReg+pParse
2e240 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3e 20 69 46  ->nRangeReg > iF
2e250 69 72 73 74 0a 20 20 20 26 26 20 70 50 61 72 73  irst.   && pPars
2e260 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3c 3d 20  e->iRangeReg <= 
2e270 69 4c 61 73 74 0a 20 20 29 7b 0a 20 20 20 20 20  iLast.  ){.     
2e280 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2e290 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
2e2a0 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b  e->nTempReg; i++
2e2b0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
2e2c0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d  e->aTempReg[i]>=
2e2d0 69 46 69 72 73 74 20 26 26 20 70 50 61 72 73 65  iFirst && pParse
2e2e0 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69  ->aTempReg[i]<=i
2e2f0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
2e300 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
2e310 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2e320 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2e330 5f 44 45 42 55 47 20 2a 2f 0a                    _DEBUG */.